aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Gohman <sunfish@mozilla.com>2015-06-05 14:33:09 -0700
committerDan Gohman <sunfish@mozilla.com>2015-06-10 09:28:21 -0700
commitaaa50db3bd0d1f783f6f2db5da26e3e8fbae12f3 (patch)
tree9e410708b3891baa953bb87d2785e601b8979271
parent6525f08e1c9a3a7905b60d83616c3e0e80dabe30 (diff)
downloadnanowasm-design-aaa50db3bd0d1f783f6f2db5da26e3e8fbae12f3.tar.gz
Make INT32_MIN%-1 trap.
It doesn't actually overflow, but the corresponding division overflows, so even though we could define it to be correct, it isn't especially useful. Also, this operation is UB in C and LLVM.
-rw-r--r--AstSemantics.md3
-rw-r--r--Polyfill.md1
2 files changed, 3 insertions, 1 deletions
diff --git a/AstSemantics.md b/AstSemantics.md
index 04baf1a..c2bc466 100644
--- a/AstSemantics.md
+++ b/AstSemantics.md
@@ -307,7 +307,8 @@ and 0 representing false.
* Int32Ule - unsigned less than or equal
Division or remainder by zero traps.
-Signed division overflow (e.g. INT32_MIN/-1) traps.
+Signed division overflow (INT32_MIN/-1) and the corresponding signed
+remainder operation (INT32_MIN%-1) trap.
Shifts interpret their shift count operand as an unsigned value. When the
shift count is at least the bitwidth of the shift, Shl and Shr return 0,
diff --git a/Polyfill.md b/Polyfill.md
index 5a8ec93..ce215f8 100644
--- a/Polyfill.md
+++ b/Polyfill.md
@@ -65,6 +65,7 @@ Some divergences that we've identified as potentially desirable:
standard behavior:
- Division by zero returns zero;
- `INT32_MIN / -1` returns `INT32_MIN`;
+ - `INT32_MIN % -1` returns `0`;
- Shift counts are implicitly masked.
* **[Datatype conversions](AstSemantics.md#datatype-conversions-truncations-reinterpretations-promotions-and-demotions)**:
Regardless of WebAssembly behavior, an asm.js polyfill will follow its