@@ -267,9 +267,9 @@ compileJS (JSWhile cond body) =
269compileJS (JSWord word)
269compileJS (JSWord word)
270− | JSWord8 b <- word = show b
270+ | JSWord8 b <- word = "new Uint8Array([" ++ show b ++ "])"
271− | JSWord16 b <- word = show b
271+ | JSWord16 b <- word = "new Uint16Array([" ++ show b ++ "])"
272− | JSWord32 b <- word = show b
272+ | JSWord32 b <- word = "new Uint32Array([" ++ show b ++ "])"
273 | JSWord64 b <- word = idrRTNamespace ++ "bigInt(\"" ++ show b ++ "\")"
273 | JSWord64 b <- word = idrRTNamespace ++ "bigInt(\"" ++ show b ++ "\")"
@@ -343,6 +343,19 @@ jsLet name value body =
343jsError :: String -> JS
343jsError :: String -> JS
344jsError err = JSApp (JSFunction [] (JSError err)) []
344jsError err = JSApp (JSFunction [] (JSError err)) []
346+jsUnPackBits :: JS -> JS
347+jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
350+jsPackBits8 :: JS -> JS
351+jsPackBits8 js = JSNew "Uint8Array" [JSArray [js]]
353+jsPackBits16 :: JS -> JS
354+jsPackBits16 js = JSNew "Uint16Array" [JSArray [js]]
356+jsPackBits32 :: JS -> JS
357+jsPackBits32 js = JSNew "Uint32Array" [JSArray [js]]
347foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
360foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
348foldJS tr add acc js =
361foldJS tr add acc js =
@@ -1830,16 +1843,25 @@ translateExpression (SApp tc name vars)
1830translateExpression (SOp op vars)
1843translateExpression (SOp op vars)
1831 | LNoOp <- op = JSVar (last vars)
1844 | LNoOp <- op = JSVar (last vars)
1833− | (LZExt (ITFixed IT8) ITNative) <- op = JSVar (last vars)
1846+ | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1835 | (LLSHR (ITFixed IT8)) <- op
1848 | (LLSHR (ITFixed IT8)) <- op
1836− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1849+ , (lhs:rhs:_) <- vars =
1851+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1838 | (LLSHR (ITFixed IT16)) <- op
1854 | (LLSHR (ITFixed IT16)) <- op
1839− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1855+ , (lhs:rhs:_) <- vars =
1857+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1841 | (LLSHR (ITFixed IT32)) <- op
1860 | (LLSHR (ITFixed IT32)) <- op
1842− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1861+ , (lhs:rhs:_) <- vars =
1863+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1844 | (LLSHR (ITFixed IT64)) <- op
1866 | (LLSHR (ITFixed IT64)) <- op
1845 , (lhs:rhs:_) <- vars =
1867 , (lhs:rhs:_) <- vars =
@@ -1898,24 +1920,48 @@ translateExpression (SOp op vars)
1899 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1921 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1900 , (arg:_) <- vars =
1922 , (arg:_) <- vars =
1901− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFF))
1924+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFF))
1903 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1927 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1904 , (arg:_) <- vars =
1928 , (arg:_) <- vars =
1905− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFFFF))
1930+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFFFF))
1907 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1933 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1908 , (arg:_) <- vars =
1934 , (arg:_) <- vars =
1909− jsMeth (jsMeth (JSVar arg) "and" [
1936+ jsMeth (jsMeth (JSVar arg) "and" [
1910− jsBigInt (JSString $ show 0xFFFFFFFF)
1937+ jsBigInt (JSString $ show 0xFFFFFFFF)
1911− ]) "intValue" []
1938+ ]) "intValue" []
1913 | (LTrunc ITBig (ITFixed IT64)) <- op
1941 | (LTrunc ITBig (ITFixed IT64)) <- op
1914 , (arg:_) <- vars =
1942 , (arg:_) <- vars =
1915 jsMeth (JSVar arg) "and" [
1943 jsMeth (JSVar arg) "and" [
1916− jsBigInt (JSString $ show 0xFFFFFFFF)
1944+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1947+ | (LAnd (ITFixed IT8)) <- op
1948+ , (lhs:rhs:_) <- vars =
1950+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1953+ | (LAnd (ITFixed IT16)) <- op
1954+ , (lhs:rhs:_) <- vars =
1956+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1959+ | (LAnd (ITFixed IT32)) <- op
1960+ , (lhs:rhs:_) <- vars =
1962+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1919 | (LAnd (ITFixed IT64)) <- op
1965 | (LAnd (ITFixed IT64)) <- op
1920 , (lhs:rhs:_) <- vars =
1966 , (lhs:rhs:_) <- vars =
1921 jsMeth (JSVar lhs) "and" [JSVar rhs]
1967 jsMeth (JSVar lhs) "and" [JSVar rhs]