@@ -48,21 +48,6 @@ let value_type = function
48
48
| "f64" -> Types. Float64Type
49
49
| _ -> assert false
50
50
51
- let mem_type s t =
52
- let open Memory in
53
- match s, t with
54
- | 's' , "i8" -> SInt8Mem
55
- | 's' , "i16" -> SInt16Mem
56
- | 's' , "i32" -> SInt32Mem
57
- | 's' , "i64" -> SInt64Mem
58
- | 'u' , "i8" -> UInt8Mem
59
- | 'u' , "i16" -> UInt16Mem
60
- | 'u' , "i32" -> UInt32Mem
61
- | 'u' , "i64" -> UInt64Mem
62
- | ' ' , "f32" -> Float32Mem
63
- | ' ' , "f64" -> Float64Mem
64
- | _ -> assert false
65
-
66
51
let intop t i32 i64 =
67
52
match t with
68
53
| "i32" -> Values. Int32 i32
@@ -75,16 +60,25 @@ let floatop t f32 f64 =
75
60
| "f64" -> Values. Float64 f64
76
61
| _ -> assert false
77
62
78
- let default_alignment = function
79
- | "i8" -> 1
80
- | "i16" -> 2
81
- | "i32" | "f32" -> 4
82
- | "i64" | "f64" -> 8
63
+ let mem_type t sign memty =
64
+ let open Memory in
65
+ match t, sign, memty with
66
+ | ("i32" | "i64" ), 's' , "i8" -> SInt8Mem
67
+ | ("i32" | "i64" ), 's' , "i16" -> SInt16Mem
68
+ | ("i32" | "i64" ), 's' , "i32" -> SInt32Mem
69
+ | "i64" , 's' , "i64" -> SInt64Mem
70
+ | ("i32" | "i64" ), 'u' , "i8" -> UInt8Mem
71
+ | ("i32" | "i64" ), 'u' , "i16" -> UInt16Mem
72
+ | ("i32" | "i64" ), 'u' , "i32" -> UInt32Mem
73
+ | "i64" , 'u' , "i64" -> UInt64Mem
74
+ | "f32" , ' ' , "f32" -> Float32Mem
75
+ | "f64" , ' ' , "f64" -> Float64Mem
83
76
| _ -> assert false
84
77
85
- let memop a s t =
86
- let align = if a = " " then default_alignment t else int_of_string a in
87
- {align; mem = mem_type s t}
78
+ let memop ty sign memsize a =
79
+ let memty = mem_type ty sign memsize in
80
+ let align = if a = " " then Memory. mem_size memty else int_of_string a in
81
+ {ty = value_type ty; mem = memty; align}
88
82
}
89
83
90
84
@@ -145,16 +139,19 @@ rule token = parse
145
139
| " load_global" { LOADGLOBAL }
146
140
| " store_global" { STOREGLOBAL }
147
141
148
- | " load_" (sign as s)" ." (align as a)" ." (mixx as t) { LOAD (memop a s t) }
149
- | " store_" (sign as s)" ." (align as a)" ." (mixx as t) { STORE (memop a s t) }
150
- | " load_" (sign as s)" ." (mixx as t) { LOAD (memop " " s t) }
151
- | " store_" (sign as s)" ." (mixx as t) { STORE (memop " " s t) }
152
- | " load." (align as a)" ." (mfxx as t) { LOAD (memop a ' ' t) }
153
- | " store." (align as a)" ." (mfxx as t) { STORE (memop a ' ' t) }
154
- | " load." (mfxx as t) { LOAD (memop " " ' ' t) }
155
- | " store." (mfxx as t) { STORE (memop " " ' ' t) }
142
+ | (ixx as t)" .load_" (sign as s)" /" (mixx as m)" /" (align as a)
143
+ { LOAD (memop t s m a) }
144
+ | (ixx as t)" .load_" (sign as s)" /" (mixx as m) { LOAD (memop t s m " " ) }
145
+ | (ixx as t)" .load/" (mixx as m)" /" (align as a) { LOAD (memop t 's' m a) }
146
+ | (ixx as t)" .load/" (mixx as m) { LOAD (memop t 's' m " " ) }
147
+ | (ixx as t)" .store/" (mixx as m)" /" (align as a) { STORE (memop t 's' m a) }
148
+ | (ixx as t)" .store/" (mixx as m) { STORE (memop t 's' m " " ) }
149
+ | (fxx as t)" .load/" (mfxx as m)" /" (align as a) { LOAD (memop t ' ' m a) }
150
+ | (fxx as t)" .store/" (mfxx as m)" /" (align as a) { STORE (memop t ' ' m a) }
151
+ | (fxx as t)" .load/" (mfxx as m) { LOAD (memop t ' ' m " " ) }
152
+ | (fxx as t)" .store/" (mfxx as m) { STORE (memop t ' ' m " " ) }
156
153
157
- | " switch. " (nxx as t) { SWITCH (value_type t) }
154
+ | " switch/ " (nxx as t) { SWITCH (value_type t) }
158
155
| (nxx as t)" .const" { CONST (value_type t) }
159
156
160
157
| (ixx as t)" .neg" { UNARY (intop t Int32Op. Neg Int64Op. Neg ) }
@@ -206,31 +203,31 @@ rule token = parse
206
203
| (fxx as t)" .gt" { COMPARE (floatop t Float32Op. Gt Float64Op. Gt ) }
207
204
| (fxx as t)" .ge" { COMPARE (floatop t Float32Op. Ge Float64Op. Ge ) }
208
205
209
- | " i64.extend_s. i32" { CONVERT (Values. Int64 Int64Op. ExtendSInt32 ) }
210
- | " i64.extend_u. i32" { CONVERT (Values. Int64 Int64Op. ExtendUInt32 ) }
211
- | " i64.wrap. i64" { CONVERT (Values. Int32 Int32Op. WrapInt64 ) }
212
- | (ixx as t)" .trunc_s. f32"
206
+ | " i64.extend_s/ i32" { CONVERT (Values. Int64 Int64Op. ExtendSInt32 ) }
207
+ | " i64.extend_u/ i32" { CONVERT (Values. Int64 Int64Op. ExtendUInt32 ) }
208
+ | " i64.wrap/ i64" { CONVERT (Values. Int32 Int32Op. WrapInt64 ) }
209
+ | (ixx as t)" .trunc_s/ f32"
213
210
{ CONVERT (intop t Int32Op. TruncSFloat32 Int64Op. TruncSFloat32 ) }
214
- | (ixx as t)" .trunc_u. f32"
211
+ | (ixx as t)" .trunc_u/ f32"
215
212
{ CONVERT (intop t Int32Op. TruncUFloat32 Int64Op. TruncUFloat32 ) }
216
- | (ixx as t)" .trunc_s. f64"
213
+ | (ixx as t)" .trunc_s/ f64"
217
214
{ CONVERT (intop t Int32Op. TruncSFloat64 Int64Op. TruncSFloat64 ) }
218
- | (ixx as t)" .trunc_u. f64"
215
+ | (ixx as t)" .trunc_u/ f64"
219
216
{ CONVERT (intop t Int32Op. TruncUFloat64 Int64Op. TruncUFloat64 ) }
220
- | (fxx as t)" .convert_s. i32"
217
+ | (fxx as t)" .convert_s/ i32"
221
218
{ CONVERT (floatop t Float32Op. ConvertSInt32 Float64Op. ConvertSInt32 ) }
222
- | (fxx as t)" .convert_u. i32"
219
+ | (fxx as t)" .convert_u/ i32"
223
220
{ CONVERT (floatop t Float32Op. ConvertUInt32 Float64Op. ConvertUInt32 ) }
224
- | (fxx as t)" .convert_s. i64"
221
+ | (fxx as t)" .convert_s/ i64"
225
222
{ CONVERT (floatop t Float32Op. ConvertSInt64 Float64Op. ConvertSInt64 ) }
226
- | (fxx as t)" .convert_u. i64"
223
+ | (fxx as t)" .convert_u/ i64"
227
224
{ CONVERT (floatop t Float32Op. ConvertUInt64 Float64Op. ConvertUInt64 ) }
228
- | " f64.promote. f32" { CONVERT (Values. Float64 Float64Op. PromoteFloat32 ) }
229
- | " f32.demote. f64" { CONVERT (Values. Float32 Float32Op. DemoteFloat64 ) }
230
- | " f32.reinterpret. i32" { CONVERT (Values. Float32 Float32Op. ReinterpretInt ) }
231
- | " f64.reinterpret. i64" { CONVERT (Values. Float64 Float64Op. ReinterpretInt ) }
232
- | " i32.reinterpret. f32" { CONVERT (Values. Int32 Int32Op. ReinterpretFloat ) }
233
- | " i64.reinterpret. f64" { CONVERT (Values. Int64 Int64Op. ReinterpretFloat ) }
225
+ | " f64.promote/ f32" { CONVERT (Values. Float64 Float64Op. PromoteFloat32 ) }
226
+ | " f32.demote/ f64" { CONVERT (Values. Float32 Float32Op. DemoteFloat64 ) }
227
+ | " f32.reinterpret/ i32" { CONVERT (Values. Float32 Float32Op. ReinterpretInt ) }
228
+ | " f64.reinterpret/ i64" { CONVERT (Values. Float64 Float64Op. ReinterpretInt ) }
229
+ | " i32.reinterpret/ f32" { CONVERT (Values. Int32 Int32Op. ReinterpretFloat ) }
230
+ | " i64.reinterpret/ f64" { CONVERT (Values. Int64 Int64Op. ReinterpretFloat ) }
234
231
235
232
| " func" { FUNC }
236
233
| " param" { PARAM }
0 commit comments