@@ -15,6 +15,14 @@ grammar Binstr/parametric : instr =
1515
1616;; Control instructions
1717
18+ syntax castop = (null?, null?)
19+
20+ grammar Bcastop : castop =
21+ | 0x00 => (eps, eps)
22+ | 0x01 => (NULL, eps)
23+ | 0x02 => (eps, NULL)
24+ | 0x03 => (NULL, NULL)
25+
1826grammar Bblocktype : blocktype =
1927 | 0x40 => _RESULT eps
2028 | t:Bvaltype => _RESULT t
@@ -42,6 +50,12 @@ grammar Binstr/control : instr = ...
4250 | 0x14 x:Btypeidx => CALL_REF (_IDX x)
4351 | 0x15 x:Btypeidx => RETURN_CALL_REF (_IDX x)
4452 | 0x1F bt:Bblocktype c*:Blist(Bcatch) (in:Binstr)* 0x0B => TRY_TABLE bt c* in*
53+ | 0xD5 l:Blabelidx => BR_ON_NULL l
54+ | 0xD6 l:Blabelidx => BR_ON_NON_NULL l
55+ | 0xFB 24:Bu32 (null_1?, null_2?):Bcastop
56+ l:Blabelidx ht_1:Bheaptype ht_2:Bheaptype => BR_ON_CAST l (REF null_1? ht_1) (REF null_2? ht_2)
57+ | 0xFB 25:Bu32 (null_1?, null_2?):Bcastop
58+ l:Blabelidx ht_1:Bheaptype ht_2:Bheaptype => BR_ON_CAST_FAIL l (REF null_1? ht_1) (REF null_2? ht_2)
4559 | ...
4660
4761grammar Bcatch : catch =
@@ -122,22 +136,16 @@ grammar Binstr/memory : instr = ...
122136
123137;; Reference instructions
124138
125- syntax castop = (null?, null?)
126-
127- grammar Bcastop : castop =
128- | 0x00 => (eps, eps)
129- | 0x01 => (NULL, eps)
130- | 0x02 => (eps, NULL)
131- | 0x03 => (NULL, NULL)
132-
133139grammar Binstr/ref : instr = ...
134140 | 0xD0 ht:Bheaptype => REF.NULL ht
135141 | 0xD1 => REF.IS_NULL
136142 | 0xD2 x:Bfuncidx => REF.FUNC x
137143 | 0xD3 => REF.EQ
138144 | 0xD4 => REF.AS_NON_NULL
139- | 0xD5 l:Blabelidx => BR_ON_NULL l
140- | 0xD6 l:Blabelidx => BR_ON_NON_NULL l
145+ | 0xFB 20:Bu32 ht:Bheaptype => REF.TEST (REF ht)
146+ | 0xFB 21:Bu32 ht:Bheaptype => REF.TEST (REF NULL ht)
147+ | 0xFB 22:Bu32 ht:Bheaptype => REF.CAST (REF ht)
148+ | 0xFB 23:Bu32 ht:Bheaptype => REF.CAST (REF NULL ht)
141149 | ...
142150
143151grammar Binstr/struct : instr = ...
@@ -166,17 +174,6 @@ grammar Binstr/array : instr = ...
166174 | 0xFB 19:Bu32 x:Btypeidx y:Belemidx => ARRAY.INIT_ELEM x y
167175 | ...
168176
169- grammar Binstr/cast : instr = ...
170- | 0xFB 20:Bu32 ht:Bheaptype => REF.TEST (REF ht)
171- | 0xFB 21:Bu32 ht:Bheaptype => REF.TEST (REF NULL ht)
172- | 0xFB 22:Bu32 ht:Bheaptype => REF.CAST (REF ht)
173- | 0xFB 23:Bu32 ht:Bheaptype => REF.CAST (REF NULL ht)
174- | 0xFB 24:Bu32 (null_1?, null_2?):Bcastop
175- l:Blabelidx ht_1:Bheaptype ht_2:Bheaptype => BR_ON_CAST l (REF null_1? ht_1) (REF null_2? ht_2)
176- | 0xFB 25:Bu32 (null_1?, null_2?):Bcastop
177- l:Blabelidx ht_1:Bheaptype ht_2:Bheaptype => BR_ON_CAST_FAIL l (REF null_1? ht_1) (REF null_2? ht_2)
178- | ...
179-
180177grammar Binstr/extern : instr = ...
181178 | 0xFB 26:Bu32 => ANY.CONVERT_EXTERN
182179 | 0xFB 27:Bu32 => EXTERN.CONVERT_ANY
0 commit comments