implement simd int extensions

This commit is contained in:
Ilya Rezvov
2025-01-12 20:58:28 -07:00
parent 10d1db7b96
commit 6637aa7275
2 changed files with 24 additions and 1 deletions
+23
View File
@@ -2235,6 +2235,7 @@ eval budget store inst FunctionInstance { funcType, moduleInstance, code = Funct
I16x8 -> all (/= 0) $ ByteArray.indexByteArray @Word16 v <$> [0..7]
I32x4 -> all (/= 0) $ ByteArray.indexByteArray @Word32 v <$> [0..3]
I64x2 -> all (/= 0) $ ByteArray.indexByteArray @Word64 v <$> [0..1]
_ -> error "impossible due to validation"
in
return $ Done ctx { stack = VI32 (if r then 1 else 0) : rest }
step ctx@EvalCtx{ stack = (VV128 v:rest) } (V128BitMask shape) =
@@ -2243,6 +2244,7 @@ eval budget store inst FunctionInstance { funcType, moduleInstance, code = Funct
I16x8 -> (\i -> flip shiftL i . flip shiftR 15 . fromIntegral $ ByteArray.indexByteArray @Word16 v i) <$> [0..7]
I32x4 -> (\i -> flip shiftL i . flip shiftR 31 . fromIntegral $ ByteArray.indexByteArray @Word32 v i) <$> [0..3]
I64x2 -> (\i -> flip shiftL i . fromIntegral $ flip shiftR 63 $ ByteArray.indexByteArray @Word64 v i) <$> [0..1]
_ -> error "impossible due to validation"
in
return $ Done ctx { stack = VI32 r : rest }
step ctx@EvalCtx{ stack = (VV128 c:VV128 v2:VV128 v1:rest) } V128BitSelect =
@@ -2254,6 +2256,27 @@ eval budget store inst FunctionInstance { funcType, moduleInstance, code = Funct
in
let r = ByteArray.byteArrayFromList @Word64 $ bitselect <$> [0, 1] in
return $ Done ctx { stack = VV128 r : rest }
step ctx@EvalCtx{ stack = (VV128 v:rest) } (V128IExtend to from high signed) =
let vals = case from of
I8x16 ->
(if signed then fromIntegral . asInt8 else fromIntegral)
. ByteArray.indexByteArray @Word8 v
<$> if high then [8..15] else [0..7]
I16x8 -> (if signed then fromIntegral . asInt16 else fromIntegral)
. ByteArray.indexByteArray @Word16 v
<$> if high then [4..7] else [0..3]
I32x4 -> fromIntegral . (if signed then fromIntegral . asInt32 else fromIntegral)
. ByteArray.indexByteArray @Word32 v
<$> if high then [2..3] else [0..1]
_ -> error "impossible due to validation"
in
let r = case to of
I16x8 -> ByteArray.byteArrayFromList @Word16 $ fromIntegral <$> vals
I32x4 -> ByteArray.byteArrayFromList @Word32 $ fromIntegral <$> vals
I64x2 -> ByteArray.byteArrayFromList @Word64 $ fromIntegral <$> vals
_ -> error "impossible due to validation"
in
return $ Done ctx { stack = VV128 r : rest }
step EvalCtx{ stack } instr = error $ "Error during evaluation of instruction: " ++ show instr ++ ". Stack " ++ show stack
eval _ _ _ HostInstance { funcType, hostCode } args = Just <$> hostCode args
+1 -1
View File
@@ -20,7 +20,7 @@ main = do
filter (List.isPrefixOf "simd") .
filter (List.isSuffixOf ".wast")
<$> Directory.listDirectory "tests/spec"
let files = ["simd_conversions.wast"]
-- let files = ["simd_int_to_int_extend.wast"]
scriptTestCases <- (`mapM` files) $ \file -> do
test <- LBS.readFile ("tests/spec/" ++ file)
return $ testCase file $ do