@@ -162,7 +162,7 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
162
162
visit_i64_load16_u, I64Load16U ,
163
163
visit_i64_load32_s, I64Load32S ,
164
164
visit_i64_load32_u, I64Load32U ,
165
- visit_i32_store, I32Store ,
165
+ // visit_i32_store, I32Store,
166
166
visit_i64_store, I64Store ,
167
167
visit_f32_store, F32Store ,
168
168
visit_f64_store, F64Store ,
@@ -321,6 +321,37 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
321
321
visit_i64_trunc_sat_f64_u, Instruction :: I64TruncSatF64U
322
322
}
323
323
324
+ fn visit_i32_store ( & mut self , memarg : wasmparser:: MemArg ) -> Self :: Output {
325
+ let arg = convert_memarg ( memarg) ;
326
+ let i32store = Instruction :: I32Store { offset : arg. offset , mem_addr : arg. mem_addr } ;
327
+
328
+ if self . instructions . len ( ) < 3 {
329
+ return self . visit ( i32store) ;
330
+ }
331
+
332
+ #[ cold]
333
+ fn cold ( ) { }
334
+
335
+ if arg. mem_addr > 0xFF || arg. offset > 0xFFFF_FFFF {
336
+ cold ( ) ;
337
+ return self . visit ( i32store) ;
338
+ }
339
+
340
+ match self . instructions [ self . instructions . len ( ) - 2 ..] {
341
+ [ Instruction :: LocalGet ( a) , Instruction :: I32Const ( b) ] => {
342
+ self . instructions . pop ( ) ;
343
+ self . instructions . pop ( ) ;
344
+ self . visit ( Instruction :: I32StoreLocal {
345
+ local : a,
346
+ consti32 : b,
347
+ offset : arg. offset as u32 ,
348
+ mem_addr : arg. mem_addr as u8 ,
349
+ } )
350
+ }
351
+ _ => self . visit ( i32store) ,
352
+ }
353
+ }
354
+
324
355
fn visit_local_get ( & mut self , idx : u32 ) -> Self :: Output {
325
356
if let Some ( instruction) = self . instructions . last_mut ( ) {
326
357
match instruction {
@@ -369,19 +400,18 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
369
400
}
370
401
371
402
fn visit_i32_add ( & mut self ) -> Self :: Output {
372
- self . visit ( Instruction :: I32Add )
373
- // if self.instructions.len() < 2 {
374
- // return self.visit(Instruction::I32Add);
375
- // }
403
+ if self . instructions . len ( ) < 2 {
404
+ return self . visit ( Instruction :: I32Add ) ;
405
+ }
376
406
377
- // match self.instructions[self.instructions.len() - 2..] {
378
- // // [Instruction::LocalGet(a), Instruction::I32Const(b)] => {
379
- // // self.instructions.pop();
380
- // // self.instructions.pop();
381
- // // self.visit(Instruction::I32LocalGetConstAdd(a, b))
382
- // // }
383
- // _ => self.visit(Instruction::I32Add),
384
- // }
407
+ match self . instructions [ self . instructions . len ( ) - 2 ..] {
408
+ [ Instruction :: LocalGet ( a) , Instruction :: I32Const ( b) ] => {
409
+ self . instructions . pop ( ) ;
410
+ self . instructions . pop ( ) ;
411
+ self . visit ( Instruction :: I32LocalGetConstAdd ( a, b) )
412
+ }
413
+ _ => self . visit ( Instruction :: I32Add ) ,
414
+ }
385
415
}
386
416
387
417
fn visit_block ( & mut self , blockty : wasmparser:: BlockType ) -> Self :: Output {
0 commit comments