@@ -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,28 @@ 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+jsPackUBits8 :: JS -> JS
351+jsPackUBits8 js = JSNew "Uint8Array" [JSArray [js]]
353+jsPackUBits16 :: JS -> JS
354+jsPackUBits16 js = JSNew "Uint16Array" [JSArray [js]]
356+jsPackUBits32 :: JS -> JS
357+jsPackUBits32 js = JSNew "Uint32Array" [JSArray [js]]
359+jsPackSBits8 :: JS -> JS
360+jsPackSBits8 js = JSNew "Int8Array" [JSArray [js]]
362+jsPackSBits16 :: JS -> JS
363+jsPackSBits16 js = JSNew "Int16Array" [JSArray [js]]
365+jsPackSBits32 :: JS -> JS
366+jsPackSBits32 js = JSNew "Int32Array" [JSArray [js]]
347foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
369foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
348foldJS tr add acc js =
370foldJS tr add acc js =
@@ -1830,20 +1852,9 @@ translateExpression (SApp tc name vars)
1830translateExpression (SOp op vars)
1852translateExpression (SOp op vars)
1831 | LNoOp <- op = JSVar (last vars)
1853 | LNoOp <- op = JSVar (last vars)
1833− | (LZExt (ITFixed IT8) ITNative) <- op = JSVar (last vars)
1855+ | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1834−
1856+ | (LZExt (ITFixed IT16) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1835− | (LLSHR (ITFixed IT8)) <- op
1857+ | (LZExt (ITFixed IT32) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1836− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1838− | (LLSHR (ITFixed IT16)) <- op
1839− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1841− | (LLSHR (ITFixed IT32)) <- op
1842− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1844− | (LLSHR (ITFixed IT64)) <- op
1845− , (lhs:rhs:_) <- vars =
1846− jsMeth (JSVar lhs) "shiftRight" [JSVar rhs]
1848 | (LZExt _ ITBig) <- op = jsBigInt $ jsCall "String" [JSVar (last vars)]
1859 | (LZExt _ ITBig) <- op = jsBigInt $ jsCall "String" [JSVar (last vars)]
1849 | (LPlus (ATInt ITBig)) <- op
1860 | (LPlus (ATInt ITBig)) <- op
@@ -1898,34 +1909,423 @@ translateExpression (SOp op vars)
1899 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1910 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1900 , (arg:_) <- vars =
1911 , (arg:_) <- vars =
1901− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFF))
1913+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFF))
1903 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1916 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1904 , (arg:_) <- vars =
1917 , (arg:_) <- vars =
1905− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFFFF))
1919+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFFFF))
1907 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1922 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1908 , (arg:_) <- vars =
1923 , (arg:_) <- vars =
1909− jsMeth (jsMeth (JSVar arg) "and" [
1925+ jsMeth (jsMeth (JSVar arg) "and" [
1910− jsBigInt (JSString $ show 0xFFFFFFFF)
1926+ jsBigInt (JSString $ show 0xFFFFFFFF)
1911− ]) "intValue" []
1927+ ]) "intValue" []
1913 | (LTrunc ITBig (ITFixed IT64)) <- op
1930 | (LTrunc ITBig (ITFixed IT64)) <- op
1914 , (arg:_) <- vars =
1931 , (arg:_) <- vars =
1915 jsMeth (JSVar arg) "and" [
1932 jsMeth (JSVar arg) "and" [
1916− jsBigInt (JSString $ show 0xFFFFFFFF)
1933+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1936+ | (LLSHR (ITFixed IT8)) <- op
1937+ , (lhs:rhs:_) <- vars =
1939+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1942+ | (LLSHR (ITFixed IT16)) <- op
1943+ , (lhs:rhs:_) <- vars =
1945+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1948+ | (LLSHR (ITFixed IT32)) <- op
1949+ , (lhs:rhs:_) <- vars =
1951+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1954+ | (LLSHR (ITFixed IT64)) <- op
1955+ , (lhs:rhs:_) <- vars =
1956+ jsMeth (JSVar lhs) "shiftRight" [JSVar rhs]
1958+ | (LSHL (ITFixed IT8)) <- op
1959+ , (lhs:rhs:_) <- vars =
1961+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1964+ | (LSHL (ITFixed IT16)) <- op
1965+ , (lhs:rhs:_) <- vars =
1967+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1970+ | (LSHL (ITFixed IT32)) <- op
1971+ , (lhs:rhs:_) <- vars =
1973+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1976+ | (LSHL (ITFixed IT64)) <- op
1977+ , (lhs:rhs:_) <- vars =
1978+ jsMeth (jsMeth (JSVar lhs) "shiftLeft" [JSVar rhs]) "and" [
1979+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1982+ | (LAnd (ITFixed IT8)) <- op
1983+ , (lhs:rhs:_) <- vars =
1985+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1988+ | (LAnd (ITFixed IT16)) <- op
1989+ , (lhs:rhs:_) <- vars =
1991+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1994+ | (LAnd (ITFixed IT32)) <- op
1995+ , (lhs:rhs:_) <- vars =
1997+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1919 | (LAnd (ITFixed IT64)) <- op
2000 | (LAnd (ITFixed IT64)) <- op
1920 , (lhs:rhs:_) <- vars =
2001 , (lhs:rhs:_) <- vars =
1921 jsMeth (JSVar lhs) "and" [JSVar rhs]
2002 jsMeth (JSVar lhs) "and" [JSVar rhs]
2004+ | (LOr (ITFixed IT8)) <- op
2005+ , (lhs:rhs:_) <- vars =
2007+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2010+ | (LOr (ITFixed IT16)) <- op
2011+ , (lhs:rhs:_) <- vars =
2013+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2016+ | (LOr (ITFixed IT32)) <- op
2017+ , (lhs:rhs:_) <- vars =
2019+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2022+ | (LOr (ITFixed IT64)) <- op
2023+ , (lhs:rhs:_) <- vars =
2024+ jsMeth (JSVar lhs) "or" [JSVar rhs]
2026+ | (LXOr (ITFixed IT8)) <- op
2027+ , (lhs:rhs:_) <- vars =
2029+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2032+ | (LXOr (ITFixed IT16)) <- op
2033+ , (lhs:rhs:_) <- vars =
2035+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2038+ | (LXOr (ITFixed IT32)) <- op
2039+ , (lhs:rhs:_) <- vars =
2041+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2044+ | (LXOr (ITFixed IT64)) <- op
2045+ , (lhs:rhs:_) <- vars =
2046+ jsMeth (JSVar lhs) "xor" [JSVar rhs]
2048+ | (LPlus (ATInt (ITFixed IT8))) <- op
2049+ , (lhs:rhs:_) <- vars =
2051+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2054+ | (LPlus (ATInt (ITFixed IT16))) <- op
2055+ , (lhs:rhs:_) <- vars =
2057+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2060+ | (LPlus (ATInt (ITFixed IT32))) <- op
2061+ , (lhs:rhs:_) <- vars =
2063+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1923 | (LPlus (ATInt (ITFixed IT64))) <- op
2066 | (LPlus (ATInt (ITFixed IT64))) <- op
1924 , (lhs:rhs:_) <- vars =
2067 , (lhs:rhs:_) <- vars =
1925 jsMeth (jsMeth (JSVar lhs) "add" [JSVar rhs]) "and" [
2068 jsMeth (jsMeth (JSVar lhs) "add" [JSVar rhs]) "and" [
1926 jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2069 jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2072+ | (LMinus (ATInt (ITFixed IT8))) <- op
2073+ , (lhs:rhs:_) <- vars =
2075+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2078+ | (LMinus (ATInt (ITFixed IT16))) <- op
2079+ , (lhs:rhs:_) <- vars =
2081+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2084+ | (LMinus (ATInt (ITFixed IT32))) <- op
2085+ , (lhs:rhs:_) <- vars =
2087+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2090+ | (LMinus (ATInt (ITFixed IT64))) <- op
2091+ , (lhs:rhs:_) <- vars =
2092+ jsMeth (jsMeth (JSVar lhs) "subtract" [JSVar rhs]) "and" [
2093+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2096+ | (LTimes (ATInt (ITFixed IT8))) <- op
2097+ , (lhs:rhs:_) <- vars =
2099+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2102+ | (LTimes (ATInt (ITFixed IT16))) <- op
2103+ , (lhs:rhs:_) <- vars =
2105+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2108+ | (LTimes (ATInt (ITFixed IT32))) <- op
2109+ , (lhs:rhs:_) <- vars =
2111+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2114+ | (LTimes (ATInt (ITFixed IT64))) <- op
2115+ , (lhs:rhs:_) <- vars =
2116+ jsMeth (jsMeth (JSVar lhs) "multiply" [JSVar rhs]) "and" [
2117+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2120+ | (LEq (ATInt (ITFixed IT8))) <- op
2121+ , (lhs:rhs:_) <- vars =
2123+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2126+ | (LEq (ATInt (ITFixed IT16))) <- op
2127+ , (lhs:rhs:_) <- vars =
2129+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2132+ | (LEq (ATInt (ITFixed IT32))) <- op
2133+ , (lhs:rhs:_) <- vars =
2135+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2138+ | (LEq (ATInt (ITFixed IT64))) <- op
2139+ , (lhs:rhs:_) <- vars =
2140+ jsMeth (jsMeth (JSVar lhs) "equals" [JSVar rhs]) "and" [
2141+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2144+ | (LLt (ITFixed IT8)) <- op
2145+ , (lhs:rhs:_) <- vars =
2147+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2150+ | (LLt (ITFixed IT16)) <- op
2151+ , (lhs:rhs:_) <- vars =
2153+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2156+ | (LLt (ITFixed IT32)) <- op
2157+ , (lhs:rhs:_) <- vars =
2159+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2162+ | (LLt (ITFixed IT64)) <- op
2163+ , (lhs:rhs:_) <- vars = invokeMeth lhs "lesser" [rhs]
2165+ | (LLe (ITFixed IT8)) <- op
2166+ , (lhs:rhs:_) <- vars =
2168+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2171+ | (LLe (ITFixed IT16)) <- op
2172+ , (lhs:rhs:_) <- vars =
2174+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2177+ | (LLe (ITFixed IT32)) <- op
2178+ , (lhs:rhs:_) <- vars =
2180+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2183+ | (LLe (ITFixed IT64)) <- op
2184+ , (lhs:rhs:_) <- vars = invokeMeth lhs "lesserOrEquals" [rhs]
2186+ | (LGt (ITFixed IT8)) <- op
2187+ , (lhs:rhs:_) <- vars =
2189+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2192+ | (LGt (ITFixed IT16)) <- op
2193+ , (lhs:rhs:_) <- vars =
2195+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2197+ | (LGt (ITFixed IT32)) <- op
2198+ , (lhs:rhs:_) <- vars =
2200+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2203+ | (LGt (ITFixed IT64)) <- op
2204+ , (lhs:rhs:_) <- vars = invokeMeth lhs "greater" [rhs]
2206+ | (LGe (ITFixed IT8)) <- op
2207+ , (lhs:rhs:_) <- vars =
2209+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2212+ | (LGe (ITFixed IT16)) <- op
2213+ , (lhs:rhs:_) <- vars =
2215+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2217+ | (LGe (ITFixed IT32)) <- op
2218+ , (lhs:rhs:_) <- vars =
2220+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2223+ | (LGe (ITFixed IT64)) <- op
2224+ , (lhs:rhs:_) <- vars = invokeMeth lhs "greaterOrEquals" [rhs]
2226+ | (LUDiv (ITFixed IT8)) <- op
2227+ , (lhs:rhs:_) <- vars =
2229+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2232+ | (LUDiv (ITFixed IT16)) <- op
2233+ , (lhs:rhs:_) <- vars =
2235+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2238+ | (LUDiv (ITFixed IT32)) <- op
2239+ , (lhs:rhs:_) <- vars =
2241+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2244+ | (LUDiv (ITFixed IT64)) <- op
2245+ , (lhs:rhs:_) <- vars = invokeMeth lhs "divide" [rhs]
2247+ | (LSDiv (ATInt (ITFixed IT8))) <- op
2248+ , (lhs:rhs:_) <- vars =
2251+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar lhs)
2253+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar rhs)
2257+ | (LSDiv (ATInt (ITFixed IT16))) <- op
2258+ , (lhs:rhs:_) <- vars =
2261+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar lhs)
2263+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar rhs)
2267+ | (LSDiv (ATInt (ITFixed IT32))) <- op
2268+ , (lhs:rhs:_) <- vars =
2271+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar lhs)
2273+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar rhs)
2277+ | (LSDiv (ATInt (ITFixed IT64))) <- op
2278+ , (lhs:rhs:_) <- vars = invokeMeth lhs "divide" [rhs]
2280+ | (LSRem (ATInt (ITFixed IT8))) <- op
2281+ , (lhs:rhs:_) <- vars =
2284+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar lhs)
2286+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar rhs)
2290+ | (LSRem (ATInt (ITFixed IT16))) <- op
2291+ , (lhs:rhs:_) <- vars =
2294+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar lhs)
2296+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar rhs)
2300+ | (LSRem (ATInt (ITFixed IT32))) <- op
2301+ , (lhs:rhs:_) <- vars =
2304+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar lhs)
2306+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar rhs)
2310+ | (LSRem (ATInt (ITFixed IT64))) <- op
2311+ , (lhs:rhs:_) <- vars = invokeMeth lhs "mod" [rhs]
2313+ | (LCompl (ITFixed IT8)) <- op
2314+ , (arg:_) <- vars =
2315+ jsPackSBits8 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2317+ | (LCompl (ITFixed IT16)) <- op
2318+ , (arg:_) <- vars =
2319+ jsPackSBits16 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2321+ | (LCompl (ITFixed IT32)) <- op
2322+ , (arg:_) <- vars =
2323+ jsPackSBits32 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2325+ | (LCompl (ITFixed IT64)) <- op
2326+ , (arg:_) <- vars =
2327+ invokeMeth arg "not" []
1929 | (LPlus _) <- op
2329 | (LPlus _) <- op
1930 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
2330 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
1931 | (LMinus _) <- op
2331 | (LMinus _) <- op