From 421d7db97627bb7760722a1a80d17cc1995d61a2 Mon Sep 17 00:00:00 2001 From: Ilya Rezvov Date: Thu, 15 Mar 2018 21:02:38 -0700 Subject: [PATCH] implement int rel operations --- src/Language/Wasm/Interpreter.hs | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/Language/Wasm/Interpreter.hs b/src/Language/Wasm/Interpreter.hs index e6e57d4..55f8b32 100644 --- a/src/Language/Wasm/Interpreter.hs +++ b/src/Language/Wasm/Interpreter.hs @@ -433,6 +433,26 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT return $ Done ctx { stack = VI32 (v1 `rotateL` fromIntegral v2) : rest } step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IBinOp BS32 IRotr) = return $ Done ctx { stack = VI32 (v1 `rotateR` fromIntegral v2) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 IEq) = + return $ Done ctx { stack = VI32 (if v1 == v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 INe) = + return $ Done ctx { stack = VI32 (if v1 /= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 ILtU) = + return $ Done ctx { stack = VI32 (if v1 < v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 ILtS) = + return $ Done ctx { stack = VI32 (if asInt32 v1 < asInt32 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 IGtU) = + return $ Done ctx { stack = VI32 (if v1 > v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 IGtS) = + return $ Done ctx { stack = VI32 (if asInt32 v1 > asInt32 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 ILeU) = + return $ Done ctx { stack = VI32 (if v1 <= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 ILeS) = + return $ Done ctx { stack = VI32 (if asInt32 v1 <= asInt32 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 IGeU) = + return $ Done ctx { stack = VI32 (if v1 >= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI32 v1:VI32 v2:rest) } (IRelOp BS32 IGeS) = + return $ Done ctx { stack = VI32 (if asInt32 v1 >= asInt32 v2 then 1 else 0) : rest } step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IBinOp BS64 IAdd) = return $ Done ctx { stack = VI64 (v1 + v2) : rest } step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IBinOp BS64 ISub) = @@ -463,6 +483,26 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT return $ Done ctx { stack = VI64 (v1 `rotateL` fromIntegral v2) : rest } step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IBinOp BS64 IRotr) = return $ Done ctx { stack = VI64 (v1 `rotateR` fromIntegral v2) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 IEq) = + return $ Done ctx { stack = VI64 (if v1 == v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 INe) = + return $ Done ctx { stack = VI64 (if v1 /= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 ILtU) = + return $ Done ctx { stack = VI64 (if v1 < v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 ILtS) = + return $ Done ctx { stack = VI64 (if asInt64 v1 < asInt64 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 IGtU) = + return $ Done ctx { stack = VI64 (if v1 > v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 IGtS) = + return $ Done ctx { stack = VI64 (if asInt64 v1 > asInt64 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 ILeU) = + return $ Done ctx { stack = VI64 (if v1 <= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 ILeS) = + return $ Done ctx { stack = VI64 (if asInt64 v1 <= asInt64 v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 IGeU) = + return $ Done ctx { stack = VI64 (if v1 >= v2 then 1 else 0) : rest } + step ctx@EvalCtx{ stack = (VI64 v1:VI64 v2:rest) } (IRelOp BS64 IGeS) = + return $ Done ctx { stack = VI64 (if asInt64 v1 >= asInt64 v2 then 1 else 0) : rest } step _ instr = error $ "Error during evaluation of instruction " ++ show instr eval store HostInstance { funcType, tag } args = return args