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 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