From bb5fc933a9144193059a18275a6e93e8c694158c Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 13:52:38 +0100 Subject: [PATCH] add some operation --- lvtrun/src/Run/Vm.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index fec8863..f058a98 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -91,6 +91,19 @@ execOpCode _ cEx (I32Sub) = do case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } _ -> throw $ WasmError "exec I32Sub: bad type" +execOpCode _ cEx (I32Mul) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 * val2)) } + _ -> throw $ WasmError "exec I32Mul: bad type" +execOpCode _ cEx (I32Divs) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 _, I_32 0) -> throw $ WasmError "exec I32Divs: division by zero" + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 `div` val2)) } + _ -> throw $ WasmError "exec I32Divs: bad type" execOpCode _ cEx (BrIf labelIdx) = do let (value, newStack) = stackPop (ceStack cEx) case value of