@@ -40,7 +40,7 @@ trait StagedWasmEvaluator extends SAIOps {
40
40
case class F32 (i : Rep [Num ], s : Rep [SymVal ]) extends StagedNum
41
41
case class F64 (i : Rep [Num ], s : Rep [SymVal ]) extends StagedNum
42
42
43
- implicit def toStagedNum (num : Num ): StagedNum = {
43
+ def toStagedNum (num : Num ): StagedNum = {
44
44
num match {
45
45
case I32V (_) => I32 (num, Concrete (num))
46
46
case I64V (_) => I64 (num, Concrete (num))
@@ -118,7 +118,7 @@ trait StagedWasmEvaluator extends SAIOps {
118
118
val (_, newCtx) = Stack .pop()
119
119
eval(rest, kont, mkont, trail)(newCtx)
120
120
case WasmConst (num) =>
121
- val newCtx = Stack .push(num)
121
+ val newCtx = Stack .push(toStagedNum( num) )
122
122
eval(rest, kont, mkont, trail)(newCtx)
123
123
case LocalGet (i) =>
124
124
val newCtx = Stack .push(Frames .get(i))
@@ -155,7 +155,10 @@ trait StagedWasmEvaluator extends SAIOps {
155
155
case MemorySize => ???
156
156
case MemoryGrow =>
157
157
val (delta, newCtx1) = Stack .pop()
158
- val newCtx2 = Stack .push(Values .I32V (Memory .grow(delta.toInt)))(newCtx1)
158
+ val ret = Memory .grow(delta.toInt)
159
+ val retNum = Values .I32V (ret)
160
+ val retSym = " Concrete" .reflectCtrlWith[SymVal ](retNum)
161
+ val newCtx2 = Stack .push(I32 (retNum, retSym))(newCtx1)
159
162
eval(rest, kont, mkont, trail)(newCtx2)
160
163
case MemoryFill => ???
161
164
case Unreachable => unreachable()
@@ -220,6 +223,7 @@ trait StagedWasmEvaluator extends SAIOps {
220
223
val newRestCtx = Stack .shift(offset, funcTy.out.size)(restCtx)
221
224
eval(rest, kont, mk, trail)(newRestCtx)
222
225
})
226
+ // TODO: put the cond.s to path condition
223
227
if (cond.toInt != 0 ) {
224
228
eval(thn, restK _, mkont, restK _ :: trail)(newCtx)
225
229
} else {
@@ -232,6 +236,7 @@ trait StagedWasmEvaluator extends SAIOps {
232
236
case BrIf (label) =>
233
237
val (cond, newCtx) = Stack .pop()
234
238
info(s " The br_if( ${label})'s condition is " , cond.toInt)
239
+ // TODO: put the cond.s to path condition
235
240
if (cond.toInt != 0 ) {
236
241
info(s " Jump to $label" )
237
242
trail(label)(newCtx)(mkont)
@@ -320,7 +325,7 @@ trait StagedWasmEvaluator extends SAIOps {
320
325
}
321
326
322
327
def evalTestOp (op : TestOp , value : StagedNum ): StagedNum = op match {
323
- case Eqz (_) => Values . I32V ( if ( value.toInt == 0 ) 1 else 0 )
328
+ case Eqz (_) => value.isZero
324
329
}
325
330
326
331
def evalUnaryOp (op : UnaryOp , value : StagedNum ): StagedNum = op match {
@@ -523,6 +528,7 @@ trait StagedWasmEvaluator extends SAIOps {
523
528
I32 (" I32V" .reflectCtrlWith[Num ](" memory-load-int" .reflectCtrlWith[Int ](base, offset)), " sym-load-int-todo" .reflectCtrlWith[SymVal ](base, offset))
524
529
}
525
530
531
+ // Returns the previous memory size on success, or -1 if the memory cannot be grown.
526
532
def grow (delta : Rep [Int ]): Rep [Int ] = {
527
533
" memory-grow" .reflectCtrlWith[Int ](delta)
528
534
}
@@ -539,12 +545,12 @@ trait StagedWasmEvaluator extends SAIOps {
539
545
540
546
// runtime values
541
547
object Values {
542
- def I32V (i : Rep [Int ]): StagedNum = {
543
- I32 ( " I32V" .reflectCtrlWith[Num ](i), " Concrete " .reflectCtrlWith[ SymVal ]( " I32V " .reflectCtrlWith[ Num ](i)) )
548
+ def I32V (i : Rep [Int ]): Rep [ Num ] = {
549
+ " I32V" .reflectCtrlWith[Num ](i)
544
550
}
545
551
546
- def I64V (i : Rep [Long ]): StagedNum = {
547
- I64 ( " I64V" .reflectCtrlWith[Num ](i), " Concrete " .reflectCtrlWith[ SymVal ]( " I64V " .reflectCtrlWith[ Num ](i)) )
552
+ def I64V (i : Rep [Long ]): Rep [ Num ] = {
553
+ " I64V" .reflectCtrlWith[Num ](i)
548
554
}
549
555
}
550
556
@@ -574,6 +580,10 @@ trait StagedWasmEvaluator extends SAIOps {
574
580
575
581
def toInt : Rep [Int ] = " num-to-int" .reflectCtrlWith[Int ](num.i)
576
582
583
+ def isZero (): StagedNum = num match {
584
+ case I32 (x_c, x_s) => I32 (Values .I32V (" is-zero" .reflectCtrlWith[Int ](num.toInt)), " sym-is-zero" .reflectCtrlWith[SymVal ](x_s))
585
+ }
586
+
577
587
def clz (): StagedNum = num match {
578
588
case I32 (x_c, x_s) => I32 (" clz" .reflectCtrlWith[Num ](x_c), " sym-clz" .reflectCtrlWith[SymVal ](x_s))
579
589
case I64 (x_c, x_s) => I64 (" clz" .reflectCtrlWith[Num ](x_c), " sym-clz" .reflectCtrlWith[SymVal ](x_s))
@@ -750,13 +760,16 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
750
760
else if (m.toString.endsWith(" Global" )) " Global"
751
761
else if (m.toString.endsWith(" I32V" )) " I32V"
752
762
else if (m.toString.endsWith(" I64V" )) " I64V"
763
+ else if (m.toString.endsWith(" SymVal" )) " SymVal"
764
+
753
765
else super .remap(m)
754
766
}
755
767
756
- // for now, the traverse/shallow is same as the scala backend's
757
768
override def traverse (n : Node ): Unit = n match {
758
769
case Node (_, " stack-push" , List (value), _) =>
759
770
emit(" Stack.push(" ); shallow(value); emit(" );\n " )
771
+ case Node (_, " sym-stack-push" , List (s_value), _) =>
772
+ emit(" SymStack.push(" ); shallow(s_value); emit(" );\n " )
760
773
case Node (_, " stack-drop" , List (n), _) =>
761
774
emit(" Stack.drop(" ); shallow(n); emit(" );\n " )
762
775
case Node (_, " stack-init" , _, _) =>
@@ -765,12 +778,14 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
765
778
emit(" Stack.print();\n " )
766
779
case Node (_, " frame-push" , List (i), _) =>
767
780
emit(" Frames.pushFrame(" ); shallow(i); emit(" );\n " )
781
+ case Node (_, " sym-frame-push" , List (i), _) =>
782
+ emit(" SymFrames.pushFrame(" ); shallow(i); emit(" );\n " )
768
783
case Node (_, " frame-pop" , List (i), _) =>
769
784
emit(" Frames.popFrame(" ); shallow(i); emit(" );\n " )
770
- case Node (_, " frame-putAll" , List (args), _) =>
771
- emit(" Frames.putAll(" ); shallow(args); emit(" );\n " )
772
785
case Node (_, " frame-set" , List (i, value), _) =>
773
786
emit(" Frames.set(" ); shallow(i); emit(" , " ); shallow(value); emit(" );\n " )
787
+ case Node (_, " sym-frame-set" , List (i, s_value), _) =>
788
+ emit(" SymFrames.set(" ); shallow(i); emit(" , " ); shallow(s_value); emit(" );\n " )
774
789
case Node (_, " global-set" , List (i, value), _) =>
775
790
emit(" Global.globalSet(" ); shallow(i); emit(" , " ); shallow(value); emit(" );\n " )
776
791
// Note: The following code is copied from the traverse of CppBackend.scala, try to avoid duplicated code
@@ -787,10 +802,11 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
787
802
case _ => super .traverse(n)
788
803
}
789
804
790
- // code generation for pure nodes
791
805
override def shallow (n : Node ): Unit = n match {
792
806
case Node (_, " frame-get" , List (i), _) =>
793
807
emit(" Frames.get(" ); shallow(i); emit(" )" )
808
+ case Node (_, " sym-frame-get" , List (i), _) =>
809
+ emit(" SymFrames.get(" ); shallow(i); emit(" )" )
794
810
case Node (_, " stack-drop" , List (n), _) =>
795
811
emit(" Stack.drop(" ); shallow(n); emit(" )" )
796
812
case Node (_, " stack-push" , List (value), _) =>
@@ -799,10 +815,16 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
799
815
emit(" Stack.shift(" ); shallow(offset); emit(" , " ); shallow(size); emit(" )" )
800
816
case Node (_, " stack-pop" , _, _) =>
801
817
emit(" Stack.pop()" )
818
+ case Node (_, " sym-stack-pop" , _, _) =>
819
+ emit(" SymStack.pop()" )
802
820
case Node (_, " frame-pop" , List (i), _) =>
803
821
emit(" Frames.popFrame(" ); shallow(i); emit(" )" )
822
+ case Node (_, " sym-frame-pop" , List (i), _) =>
823
+ emit(" SymFrames.popFrame(" ); shallow(i); emit(" )" )
804
824
case Node (_, " stack-peek" , _, _) =>
805
825
emit(" Stack.peek()" )
826
+ case Node (_, " sym-stack-peek" , _, _) =>
827
+ emit(" SymStack.peek()" )
806
828
case Node (_, " stack-take" , List (n), _) =>
807
829
emit(" Stack.take(" ); shallow(n); emit(" )" )
808
830
case Node (_, " slice-reverse" , List (slice), _) =>
@@ -817,8 +839,14 @@ trait StagedWasmCppGen extends CGenBase with CppSAICodeGenBase {
817
839
emit(" Stack.size()" )
818
840
case Node (_, " global-get" , List (i), _) =>
819
841
emit(" Global.globalGet(" ); shallow(i); emit(" )" )
842
+ case Node (_, " is-zero" , List (num), _) =>
843
+ emit(" (0 == " ); shallow(num); emit(" )" )
844
+ case Node (_, " sym-is-zero" , List (s_num), _) =>
845
+ shallow(s_num); emit(" .is_zero()" )
820
846
case Node (_, " binary-add" , List (lhs, rhs), _) =>
821
847
shallow(lhs); emit(" + " ); shallow(rhs)
848
+ case Node (_, " sym-binary-add" , List (lhs, rhs), _) =>
849
+ shallow(lhs); emit(" + " ); shallow(rhs)
822
850
case Node (_, " binary-sub" , List (lhs, rhs), _) =>
823
851
shallow(lhs); emit(" - " ); shallow(rhs)
824
852
case Node (_, " binary-mul" , List (lhs, rhs), _) =>
0 commit comments