@@ -873,6 +873,16 @@ eval budget store FunctionInstance { funcType, moduleInstance, code = Function {
873
873
return $ Done ctx { stack = VI32 (fromIntegral $ countTrailingZeros v) : rest }
874
874
step ctx@ EvalCtx { stack = (VI32 v: rest) } (IUnOp BS32 IPopcnt ) =
875
875
return $ Done ctx { stack = VI32 (fromIntegral $ popCount v) : rest }
876
+ step ctx@ EvalCtx { stack = (VI32 v: rest) } (IUnOp BS32 IExtend8S ) =
877
+ let byte = v .&. 0xFF in
878
+ let r = if byte >= 0x80 then asWord32 (fromIntegral byte - 0x100 ) else byte in
879
+ return $ Done ctx { stack = VI32 r : rest }
880
+ step ctx@ EvalCtx { stack = (VI32 v: rest) } (IUnOp BS32 IExtend16S ) =
881
+ let half = v .&. 0xFFFF in
882
+ let r = if half >= 0x8000 then asWord32 (fromIntegral half - 0x10000 ) else half in
883
+ return $ Done ctx { stack = VI32 r : rest }
884
+ step ctx@ EvalCtx { stack = (VI32 v: rest) } (IUnOp BS32 IExtend32S ) =
885
+ return $ Done ctx { stack = VI32 v : rest }
876
886
step ctx@ EvalCtx { stack = (VI64 v2: VI64 v1: rest) } (IBinOp BS64 IAdd ) =
877
887
return $ Done ctx { stack = VI64 (v1 + v2) : rest }
878
888
step ctx@ EvalCtx { stack = (VI64 v2: VI64 v1: rest) } (IBinOp BS64 ISub ) =
@@ -939,6 +949,18 @@ eval budget store FunctionInstance { funcType, moduleInstance, code = Function {
939
949
return $ Done ctx { stack = VI64 (fromIntegral $ countTrailingZeros v) : rest }
940
950
step ctx@ EvalCtx { stack = (VI64 v: rest) } (IUnOp BS64 IPopcnt ) =
941
951
return $ Done ctx { stack = VI64 (fromIntegral $ popCount v) : rest }
952
+ step ctx@ EvalCtx { stack = (VI64 v: rest) } (IUnOp BS64 IExtend8S ) =
953
+ let byte = v .&. 0xFF in
954
+ let r = if byte >= 0x80 then asWord64 (fromIntegral byte - 0x100 ) else byte in
955
+ return $ Done ctx { stack = VI64 r : rest }
956
+ step ctx@ EvalCtx { stack = (VI64 v: rest) } (IUnOp BS64 IExtend16S ) =
957
+ let quart = v .&. 0xFFFF in
958
+ let r = if quart >= 0x8000 then asWord64 (fromIntegral quart - 0x10000 ) else quart in
959
+ return $ Done ctx { stack = VI64 r : rest }
960
+ step ctx@ EvalCtx { stack = (VI64 v: rest) } (IUnOp BS64 IExtend32S ) =
961
+ let half = v .&. 0xFFFFFFFF in
962
+ let r = if half >= 0x80000000 then asWord64 (fromIntegral half - 0x100000000 ) else half in
963
+ return $ Done ctx { stack = VI64 r : rest }
942
964
step ctx@ EvalCtx { stack = (VF32 v: rest) } (FUnOp BS32 FAbs ) =
943
965
return $ Done ctx { stack = VF32 (abs v) : rest }
944
966
step ctx@ EvalCtx { stack = (VF32 v: rest) } (FUnOp BS32 FNeg ) =
0 commit comments