@@ -57,13 +57,23 @@ See [Globals.md](Globals.md).
57
57
58
58
## New Sign-extending Operators
59
59
60
- All atomic RMW operators are zero-extending. To support sign-extending, four
60
+ All atomic RMW operators are zero-extending. To support sign-extending, five
61
61
new sign-extension operators are added:
62
62
63
- * ` i32.extend_s/i8 ` : extend a signed 8-bit integer to a 32-bit integer
64
- * ` i32.extend_s/i16 ` : extend a signed 16-bit integer to a 32-bit integer
65
- * ` i64.extend_s/i8 ` : extend a signed 8-bit integer to a 64-bit integer
66
- * ` i64.extend_s/i16 ` : extend a signed 16-bit integer to a 64-bit integer
63
+ * ` i32.extend8_s ` : extend a signed 8-bit integer to a 32-bit integer
64
+ * ` i32.extend16_s ` : extend a signed 16-bit integer to a 32-bit integer
65
+ * ` i64.extend8_s ` : extend a signed 8-bit integer to a 64-bit integer
66
+ * ` i64.extend16_s ` : extend a signed 16-bit integer to a 64-bit integer
67
+ * ` i64.extend32_s ` : extend a signed 32-bit integer to a 64-bit integer
68
+
69
+ Note that ` i64.extend32_s ` was not originally included when this proposal was
70
+ discussed in the May 2017 CG meeting. The reason given was that
71
+ the behavior matches ` i64.extend_s/i32 ` . It was later discovered that this is
72
+ not correct, as ` i64.extend_s/i32 ` sign-extends an ` i32 ` value to ` i64 ` ,
73
+ whereas ` i64.extend32_s ` sign-extends an ` i64 ` value to ` i64 ` . The behavior
74
+ of ` i64.extend32_s ` can be emulated with ` i32.wrap/i64 ` followed by
75
+ ` i64.extend_s/i32 ` , but the same can be said of the sign-extending load
76
+ operations. Therefore, ` i64.extend32_s ` has been added for consistency.
67
77
68
78
## Atomic Memory Accesses
69
79
@@ -381,10 +391,11 @@ memarg32 ::= 0x02 o: offset => {align 2, offset: o}
381
391
memarg64 ::= 0x03 o: offset => {align 3, offset: o}
382
392
383
393
instr ::= ...
384
- | 0xC0 => i32.extend_s/i8
385
- | 0xC1 => i32.extend_s/i16
386
- | 0xC2 => i64.extend_s/i8
387
- | 0xC3 => i64.extend_s/i16
394
+ | 0xC0 => i32.extend8_s
395
+ | 0xC1 => i32.extend16_s
396
+ | 0xC2 => i64.extend8_s
397
+ | 0xC3 => i64.extend16_s
398
+ | 0xC4 => i64.extend32_s
388
399
389
400
| 0xFE 0x00 m:memarg32 => wake m
390
401
| 0xFE 0x01 m:memarg32 => i32.wait m
0 commit comments