From 7214129c8c04c1dfa55dd183c736ae579cfe9767 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Mon, 15 Jun 2015 19:41:47 +0200 Subject: Don't hyphenate floating-point Most of the documentation doesn't have a hyphen. --- FutureFeatures.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FutureFeatures.md b/FutureFeatures.md index 1c98bbd..81f392b 100644 --- a/FutureFeatures.md +++ b/FutureFeatures.md @@ -251,9 +251,9 @@ well on all platforms. These should be guarded by These operations would not required to be fully precise, but the specifics would need clarification. -## 16-bit and 128-bit floating-point support +## 16-bit and 128-bit floating point support -For 16-bit floating-point support, it may make sense to split the feature +For 16-bit floating point support, it may make sense to split the feature into two parts: support for just converting between 16-bit and 32-bit or 64-bit formats possibly folded into load and store operations, and full support for actual 16-bit arithmetic. @@ -267,7 +267,7 @@ techniques such as double-double arithmetic. If we standardize 128-bit floating point in WebAssembly, it will probably be standard IEEE-754 quadruple precision. -## Floating-point library intrinsics +## Floating point library intrinsics These operations aren't needed because they can be implemented in WebAssembly code and linked into WebAssembly modules as at small size cost, and this avoids -- cgit v1.2.3 From f7f46e91912716889d0cb750bac27d6911cfcb79 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Mon, 15 Jun 2015 19:46:22 +0200 Subject: Nondeterminism: examples of exhaustion Also, use the same bullet lists as in other documents. --- Nondeterminism.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Nondeterminism.md b/Nondeterminism.md index f7c6a13..77fc899 100644 --- a/Nondeterminism.md +++ b/Nondeterminism.md @@ -25,22 +25,24 @@ other practical way to achieve [portable](Portability.md) native performance. The following is a list of the places where the WebAssembly specification currently admits nondeterminism: - - [When threads are added as a feature](PostMVP.md#threads), even without + * [When threads are added as a feature](PostMVP.md#threads), even without shared memory, nondeterminism will be visible through the global sequence of API calls. With shared memory, the result of load operations is nondeterministic. - - - [Out of bounds heap accesses *may* want some flexibility](AstSemantics.md#out-of-bounds) - - - [NaN bit patterns](AstSemantics.md#floating-point-operations) - - - [Fixed-width SIMD may want some flexibility](PostMVP.md#fixed-width-simd) - - In SIMD.js, floating point values may or may not have subnormals flushed to zero. - - In SIMD.js, operations ending in "Approximation" return approximations that may vary between platforms. - - - Environment-dependent resource limits may be exhausted. + * Out of bounds heap accesses *may* want + [some flexibility](AstSemantics.md#out-of-bounds) + * [NaN bit patterns](AstSemantics.md#floating-point-operations) + * [Fixed-width SIMD may want some flexibility](PostMVP.md#fixed-width-simd) + - In SIMD.js, floating point values may or may not have subnormals flushed to + zero. + - In SIMD.js, operations ending in "Approximation" return approximations that + may vary between platforms. + * Environment-dependent resource limits may be exhausted. A few examples: + - Memory allocation may fail. + - Program stack may get exhausted. + - Resources such as handles may get exahusted. Users of C, C++, and similar languages should be aware that operations which -have defined or constrained behavior in WebAssembly itself may nonetheless -still have undefined behavior +have defined or constrained behavior in WebAssembly itself may nonetheless still +have undefined behavior [at the source code level](CAndC++.md#undefined-behavior). -- cgit v1.2.3 From ad4137b206ad4a1886da1b95ed8731d7453c5165 Mon Sep 17 00:00:00 2001 From: Michael Holman Date: Mon, 15 Jun 2015 11:41:59 -0700 Subject: update memory loads/stores --- AstSemantics.md | 58 +++++++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/AstSemantics.md b/AstSemantics.md index a3870df..3810790 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -35,14 +35,10 @@ variables, local variables, and parameters. The heap itself is not typed, but all accesses to the heap are annotated with a type. The legal types for global variables and heap accesses are called *Memory types*. - * sint8 - signed 8-bit integer - * sint16 - signed 16-bit integer - * sint32 - signed 32-bit integer - * sint64 - signed 64-bit integer - * uint8 - unsigned 8-bit integer - * uint16 - unsigned 16-bit integer - * uint32 - unsigned 32-bit integer - * uint64 - unsigned 64-bit integer + * int8 - 8-bit integer + * int16 - 16-bit integer + * int32 - 32-bit integer + * int64 - 64-bit integer * float32 - 32-bit floating point * float64 - 64-bit floating point @@ -57,36 +53,36 @@ are a subset of the Memory types: All IR operations except loads and stores deal with local types. Loads implicitly convert Memory types to Local types according to the follow rules: - * load[sint8] - sign-extend to int32 - * load[sint16] - sign-extend to int32 - * load[sint32] - (no conversion) - * load[sint64] - (no conversion) - * load[uint8] - zero-extend to int32 - * load[uint16] - zero-extend to int32 - * load[uint32] - reinterpret as int32 - * load[uint64] - reinterpret as int64 - * load[float32] - (no conversion) - * load[float64] - (no conversion) + * int32.load_sx[int8] - sign-extend to int32 + * int32.load_sx[int16] - sign-extend to int32 + * int32.load_zx[int8] - sign-extend to int32 + * int32.load_zx[int16] - sign-extend to int32 + * int32.load[int32] - (no conversion) + * int64.load_sx[int8] - sign-extend to int64 + * int64.load_sx[int16] - sign-extend to int64 + * int64.load_sx[int32] - sign-extend to int64 + * int64.load_zx[int8] - zero-extend to int64 + * int64.load_zx[int16] - zero-extend to int64 + * int64.load_zx[int32] - zero-extend to int64 + * int64.load[int64] - (no conversion) + * float32.load[float32] - (no conversion) + * float64.load[float64] - (no conversion) Note that the local types int32 and int64 don't technically have a sign; the sign bit is interpreted differently by the operations below. -Note: [issue #139](https://github.com/WebAssembly/design/issues/139) discussed -extending loads and truncating stores in more details. - Similar to loads, stores implicitly truncate Local types to Memory types according to the following rules: - * store[sint8] - truncate int32 to sint8 - * store[sint16] - truncate int32 to sint16 - * store[sint32] - (no truncation) - * store[sint64] - (no truncation) - * store[uint8] - truncate int32 to uint8 - * store[uint16] - truncate int32 to uint16 - * store[uint32] - reinterpret int32 as uint32 - * store[uint64] - reinterpret int64 as uint64 - * store[float32] - (no truncation) - * store[float64] - (no truncation) + * int32.store[int8] - truncate int32 to int8 + * int32.store[int16] - truncate int32 to int16 + * int32.store[int32] - (no truncation) + * int64.store[int8] - truncate int64 to uint8 + * int64.store[int16] - truncate int64 to uint16 + * int64.store[int32] - truncate int64 to int32 + * int64.store[int64] - (no truncation) + * float32.store[float32] - (no truncation) + * float64.store[float64] - (no truncation) Truncation of integers simply discards any upper bits; i.e. truncation does not perform saturation, trap on overflow, etc. -- cgit v1.2.3 From d58116f9b3fb444a66a3dbdb890a68f330df913a Mon Sep 17 00:00:00 2001 From: Michael Holman Date: Mon, 15 Jun 2015 11:47:56 -0700 Subject: fix typos in descriptions --- AstSemantics.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AstSemantics.md b/AstSemantics.md index 3810790..2822f54 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -55,8 +55,8 @@ convert Memory types to Local types according to the follow rules: * int32.load_sx[int8] - sign-extend to int32 * int32.load_sx[int16] - sign-extend to int32 - * int32.load_zx[int8] - sign-extend to int32 - * int32.load_zx[int16] - sign-extend to int32 + * int32.load_zx[int8] - zero-extend to int32 + * int32.load_zx[int16] - zero-extend to int32 * int32.load[int32] - (no conversion) * int64.load_sx[int8] - sign-extend to int64 * int64.load_sx[int16] - sign-extend to int64 @@ -77,8 +77,8 @@ according to the following rules: * int32.store[int8] - truncate int32 to int8 * int32.store[int16] - truncate int32 to int16 * int32.store[int32] - (no truncation) - * int64.store[int8] - truncate int64 to uint8 - * int64.store[int16] - truncate int64 to uint16 + * int64.store[int8] - truncate int64 to int8 + * int64.store[int16] - truncate int64 to int16 * int64.store[int32] - truncate int64 to int32 * int64.store[int64] - (no truncation) * float32.store[float32] - (no truncation) -- cgit v1.2.3 From cf781d468394304794e29625d8bd9ca53578c353 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 15 Jun 2015 14:28:00 -0700 Subject: Operator names are lower-case now. --- AstSemantics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AstSemantics.md b/AstSemantics.md index a3870df..1c04006 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -343,7 +343,7 @@ The same operations are available on 64-bit integers as the ones available for Floating point arithmetic follows the IEEE-754 standard, except that: - The sign bit and significand bit pattern of any NaN value returned from a - floating point arithmetic operation other than `Neg`, `Abs`, and `Copysign` + floating point arithmetic operation other than `neg`, `abs`, and `copysign` are computed nondeterministically. In particular, the "NaN propagation" section of IEEE-754 is not required. NaNs do propagate through arithmetic operations according to IEEE-754 rules, the difference here is that they do -- cgit v1.2.3 From bbb59e5063200599eb4b88d3f0245a39724bcdf8 Mon Sep 17 00:00:00 2001 From: Michael Holman Date: Mon, 15 Jun 2015 14:37:56 -0700 Subject: Rename truncate->wrap and reword conversions from implicit->explicit --- AstSemantics.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/AstSemantics.md b/AstSemantics.md index 2822f54..80f71da 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -50,8 +50,8 @@ are a subset of the Memory types: * float32 - 32-bit floating point * float64 - 64-bit floating point -All IR operations except loads and stores deal with local types. Loads implicitly -convert Memory types to Local types according to the follow rules: +All IR operations except loads and stores deal with local types. Loads convert +Memory types to Local types according to the following rules: * int32.load_sx[int8] - sign-extend to int32 * int32.load_sx[int16] - sign-extend to int32 @@ -71,20 +71,20 @@ convert Memory types to Local types according to the follow rules: Note that the local types int32 and int64 don't technically have a sign; the sign bit is interpreted differently by the operations below. -Similar to loads, stores implicitly truncate Local types to Memory types -according to the following rules: +Similar to loads, stores convert Local types to Memory types according to the +following rules: - * int32.store[int8] - truncate int32 to int8 - * int32.store[int16] - truncate int32 to int16 - * int32.store[int32] - (no truncation) - * int64.store[int8] - truncate int64 to int8 - * int64.store[int16] - truncate int64 to int16 - * int64.store[int32] - truncate int64 to int32 - * int64.store[int64] - (no truncation) - * float32.store[float32] - (no truncation) - * float64.store[float64] - (no truncation) + * int32.store[int8] - wrap int32 to int8 + * int32.store[int16] - wrap int32 to int16 + * int32.store[int32] - (no conversion) + * int64.store[int8] - wrap int64 to int8 + * int64.store[int16] - wrap int64 to int16 + * int64.store[int32] - wrap int64 to int32 + * int64.store[int64] - (no conversion) + * float32.store[float32] - (no conversion) + * float64.store[float64] - (no conversion) -Truncation of integers simply discards any upper bits; i.e. truncation does not +Wrapping of integers simply discards any upper bits; i.e. wrapping does not perform saturation, trap on overflow, etc. ## Addressing local variables @@ -144,7 +144,6 @@ which leads to the following advantages: Each heap access is annotated with a *Memory type* and the presumed alignment of the incoming pointer. As discussed previously, loads may -include implicit zero- or sign-extension and stores may include implicit truncation. Indexes into the heap are always byte indexes. -- cgit v1.2.3 From 9ff302ec30e71d756942ef906c243349bd6ee000 Mon Sep 17 00:00:00 2001 From: Michael Holman Date: Mon, 15 Jun 2015 14:38:58 -0700 Subject: more rewording so conversions are explicit --- AstSemantics.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AstSemantics.md b/AstSemantics.md index 80f71da..eb90f30 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -144,6 +144,7 @@ which leads to the following advantages: Each heap access is annotated with a *Memory type* and the presumed alignment of the incoming pointer. As discussed previously, loads may +include explicit zero- or sign-extension and stores may include implicit wrapping. Indexes into the heap are always byte indexes. -- cgit v1.2.3 From d1dad64553a93884b0c9e4c09a1872bb794e8927 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 15 Jun 2015 15:02:34 -0700 Subject: Re-introduce integer conversion operators. --- AstSemantics.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AstSemantics.md b/AstSemantics.md index 1c04006..aa500aa 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -403,6 +403,9 @@ Min and Max operations treat -0 as being effectively less than 0. ## Datatype conversions, truncations, reinterpretations, promotions, and demotions + * int32_from_int64 - wrap a 64-bit integer to a 32-bit integer + * int64_from_sint32 - extend a signed 32-bit integer to a 64-bit integer + * int64_from_uint32 - extend an unsigned 32-bit integer to a 64-bit integer * sint32_from_float64 - truncate a 64-bit float to a signed integer * sint32_from_float32 - truncate a 32-bit float to a signed integer * uint32_from_float64 - truncate a 64-bit float to an unsigned integer @@ -426,6 +429,7 @@ Min and Max operations treat -0 as being effectively less than 0. * float32_from_int32_bits - reinterpret the bits of a 32-bit integer as a 32-bit float * float64_from_int64_bits - reinterpret the bits of a 64-bit integer as a 64-bit float +Wrapping and extension of integer values always succeeds. Promotion and demotion of floating point values always succeeds. Demotion of floating point values uses round-to-nearest ties-to-even rounding, and may overflow to infinity or negative infinity as specified by IEEE-754. -- cgit v1.2.3 From a2ca639b344d4ba790ec686f55bce0a7ae4dec89 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 15 Jun 2015 15:06:05 -0700 Subject: Subject-verb agreement. --- AstSemantics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AstSemantics.md b/AstSemantics.md index aa500aa..4a35901 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -429,8 +429,8 @@ Min and Max operations treat -0 as being effectively less than 0. * float32_from_int32_bits - reinterpret the bits of a 32-bit integer as a 32-bit float * float64_from_int64_bits - reinterpret the bits of a 64-bit integer as a 64-bit float -Wrapping and extension of integer values always succeeds. -Promotion and demotion of floating point values always succeeds. +Wrapping and extension of integer values always succeed. +Promotion and demotion of floating point values always succeed. Demotion of floating point values uses round-to-nearest ties-to-even rounding, and may overflow to infinity or negative infinity as specified by IEEE-754. If the operand of promotion or demotion is NaN, the sign bit and significand -- cgit v1.2.3 From 542508499c4815089556b8550fb6f7b0764c3b45 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 15 Jun 2015 14:41:34 -0700 Subject: Replace "IR operations" with just "operations". WebAssembly isn't called an "IR" anywhere else and it's a little confusing; fortunately the sentence here works without it. --- AstSemantics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AstSemantics.md b/AstSemantics.md index 534e58d..f659bd0 100644 --- a/AstSemantics.md +++ b/AstSemantics.md @@ -50,7 +50,7 @@ are a subset of the Memory types: * float32 - 32-bit floating point * float64 - 64-bit floating point -All IR operations except loads and stores deal with local types. Loads convert +All operations except loads and stores deal with local types. Loads convert Memory types to Local types according to the following rules: * int32.load_sx[int8] - sign-extend to int32 -- cgit v1.2.3