@@ -24,6 +24,11 @@ module WASM-NUMERIC-SYNTAX
24
24
| "nearest" [klabel(aNearest), symbol]
25
25
// -----------------------------------------------------
26
26
27
+ syntax ExtendS ::= "extend8_s" [klabel(aExtend8_s) , symbol]
28
+ | "extend16_s" [klabel(aExtend16_s), symbol]
29
+ | "extend32_s" [klabel(aExtend32_s), symbol]
30
+ // ---------------------------------------------------------------
31
+
27
32
syntax IBinOp ::= "add" [klabel(intAdd), symbol]
28
33
| "sub" [klabel(intSub), symbol]
29
34
| "mul" [klabel(intMul), symbol]
@@ -110,9 +115,10 @@ module WASM-NUMERIC
110
115
` *UnOp ` takes one oprand and returns a ` Val ` .
111
116
112
117
``` k
113
- syntax Val ::= IValType "." IUnOp Int [klabel(intUnOp) , function]
114
- | FValType "." FUnOp Float [klabel(floatUnOp), function]
115
- // ---------------------------------------------------------------------
118
+ syntax Val ::= IValType "." IUnOp Int [klabel(intUnOp) , function]
119
+ | FValType "." FUnOp Float [klabel(floatUnOp) , function]
120
+ | IValType "." ExtendS Int [klabel(extendSUnOp), function]
121
+ // ---------------------------------------------------------------------------
116
122
```
117
123
118
124
#### Unary Operators for Integers
@@ -178,6 +184,20 @@ There are 7 unary operators for floats: `abs`, `neg`, `sqrt`, `floor`, `ceil`, `
178
184
rule FTYPE . nearest F => < FTYPE > -0.0 requires (notBool #isInfinityOrNaN (F)) andBool Float2Int(F) ==Int 0 andBool signFloat(F)
179
185
```
180
186
187
+ #### Sign-extension Operators for Integers
188
+
189
+ There are 3 sign-extension operators for integers.
190
+
191
+ - ` extend8_s `
192
+ - ` extend16_s `
193
+ - ` extend32_s `
194
+
195
+ ``` k
196
+ rule ITYPE . extend8_s I => #extends(ITYPE, 1, #wrap(1, I))
197
+ rule ITYPE . extend16_s I => #extends(ITYPE, 2, #wrap(2, I))
198
+ rule ITYPE . extend32_s I => #extends(ITYPE, 4, #wrap(4, I))
199
+ ```
200
+
181
201
### Binary Operators
182
202
183
203
` *BinOp ` takes two oprands and returns a ` Val ` .
@@ -425,7 +445,13 @@ There are 7 conversion operators: `wrap`, `extend`, `trunc`, `convert`, `demote`
425
445
426
446
``` k
427
447
rule i64 . extend_i32_u I:Int => < i64 > I
428
- rule i64 . extend_i32_s I:Int => < i64 > #unsigned(i64, #signed(i32, I))
448
+ rule i64 . extend_i32_s I:Int => #extends(i64, 4, I)
449
+
450
+ syntax IVal ::= #extends(to: IValType, width: Int, val: Int) [function, klabel(extends), symbol]
451
+ // ---------------------------------------------------------------------------------------------------
452
+ rule #extends(ITYPE, WIDTH, VAL) => < ITYPE > #unsigned(ITYPE, #signedWidth(WIDTH, VAL))
453
+ requires WIDTH <=Int #numBytes(ITYPE)
454
+
429
455
```
430
456
431
457
- ` convert ` takes an ` int ` type value and convert it to the nearest ` float ` type value.
0 commit comments