@@ -70,6 +70,12 @@ object Primitives {
7070 case (I64V (v1), I64V (v2)) => I64V (v1 & v2)
7171 case _ => throw new Exception (" Invalid types" )
7272 }
73+ case Or (_) =>
74+ (lhs, rhs) match {
75+ case (I32V (v1), I32V (v2)) => I32V (v1 | v2)
76+ case (I64V (v1), I64V (v2)) => I64V (v1 | v2)
77+ case _ => throw new Exception (" Invalid types" )
78+ }
7379 case _ => {
7480 println(s " unimplemented binop: $op" )
7581 ???
@@ -180,13 +186,18 @@ object Primitives {
180186 case Concrete (v) => Concrete (evalTestOp(op, v))
181187 case _ =>
182188 op match {
183- case Eqz (_ ) => SymIte ( CondEqz (sv ), Concrete ( I32V ( 1 )) , Concrete (I32V ( 0 )))
189+ case Eqz (ty ) => RelCond ( Eq (ty ), sv , Concrete (zero(ty )))
184190 }
185191 }
186192
187193 def evalSymRelOp (op : RelOp , lhs : SymVal , rhs : SymVal ): SymVal = (lhs, rhs) match {
188194 case (Concrete (lhs), Concrete (rhs)) => Concrete (evalRelOp(op, lhs, rhs))
189- case _ => SymIte (RelCond (op, lhs, rhs), Concrete (I32V (1 )), Concrete (I32V (0 )))
195+ case _ =>
196+ RelCond (
197+ op,
198+ lhs,
199+ rhs
200+ ) // TODO: it was SymIte(RelCond(op, lhs, rhs), Concrete(I32V(1)), Concrete(I32V(0))) before, but why??
190201 }
191202
192203 def memOutOfBound (frame : Frame , memoryIndex : Int , offset : Int , size : Int ) = {
@@ -365,10 +376,10 @@ case class Evaluator(module: ModuleInstance) {
365376 case If (ty, thn, els) =>
366377 val scnd :: newSymStack = symStack
367378 val I32V (cond) :: newStack = concStack
368- val inner = if (cond = = 0 ) thn else els
379+ val inner = if (cond ! = 0 ) thn else els
369380 val newPathConds = scnd match {
370381 case Concrete (_) => pathConds
371- case _ => if (cond = = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
382+ case _ => if (cond ! = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
372383 }
373384 val k : Cont = (retStack, retSymStack, newPathConds) =>
374385 eval(rest, retStack ++ newStack, retSymStack ++ newSymStack, frame, ret, trail)(newPathConds)
@@ -380,7 +391,7 @@ case class Evaluator(module: ModuleInstance) {
380391 val I32V (cond) :: newStack = concStack
381392 val newPathConds = scnd match {
382393 case Concrete (_) => pathConds
383- case _ => if (cond = = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
394+ case _ => if (cond ! = 0 ) CondEqz (scnd) :: pathConds else Not (CondEqz (scnd)) :: pathConds
384395 }
385396 if (cond == 0 ) eval(rest, newStack, newSymStack, frame, ret, trail)(newPathConds)
386397 else trail(label)(newStack, newSymStack, newPathConds)
@@ -497,22 +508,19 @@ case class Evaluator(module: ModuleInstance) {
497508 })
498509
499510 print(s " instrs: $instrs" )
500-
501511 // val instrs = List(Call(funcId))
502512
503- // TODO: what are we tryign to do with globals here
504- // does global values allow general expressions?
505- // val globals = module.definitions.collect({ case g@Global(_, _) => g })
513+ val globals = module.defs.collect({ case g @ Global (_, _) => g })
506514
507- // for (global <- globals) {
508- // global.f match {
509- // case GlobalValue(ty, e) => {
510- // val (cv, sv) = evalExpr(e)
511- // moduleInst .globals.append((RTGlobal(ty, cv), sv))
512- // }
513- // case _ => ???
514- // }
515- // }
515+ for (global <- globals) {
516+ global.f match {
517+ case GlobalValue (ty, e) => {
518+ val (cv, sv) = evalExpr(e)
519+ module .globals.append((RTGlobal (ty, cv), sv))
520+ }
521+ case _ => ???
522+ }
523+ }
516524
517525 val locals = extractLocals(module, main)
518526
@@ -542,7 +550,7 @@ case class Evaluator(module: ModuleInstance) {
542550 System .err.println(s " Entering function $main" )
543551 module.funcs(fid) match {
544552 case FuncDef (_, FuncBodyDef (_, _, locals, _)) => locals
545- case _ => throw new Exception (" Entry function has no concrete body" )
553+ case _ => throw new Exception (" Entry function has no concrete body" )
546554 }
547555 case _ => List ()
548556 })
@@ -552,7 +560,7 @@ case class Evaluator(module: ModuleInstance) {
552560 System .err.println(s " Entering unnamed function $id" )
553561 module.funcs(id) match {
554562 case FuncDef (_, FuncBodyDef (_, _, locals, body)) => locals
555- case _ => throw new Exception (" Entry function has no concrete body" )
563+ case _ => throw new Exception (" Entry function has no concrete body" )
556564 }
557565 case _ => List ()
558566 })
0 commit comments