@@ -347,14 +347,23 @@ jsUnPackBits :: JS -> JS
347jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
347jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
350−jsPackBits8 :: JS -> JS
350+jsPackUBits8 :: JS -> JS
351−jsPackBits8 js = JSNew "Uint8Array" [JSArray [js]]
351+jsPackUBits8 js = JSNew "Uint8Array" [JSArray [js]]
353−jsPackBits16 :: JS -> JS
353+jsPackUBits16 :: JS -> JS
354−jsPackBits16 js = JSNew "Uint16Array" [JSArray [js]]
354+jsPackUBits16 js = JSNew "Uint16Array" [JSArray [js]]
356−jsPackBits32 :: JS -> JS
356+jsPackUBits32 :: JS -> JS
357−jsPackBits32 js = JSNew "Uint32Array" [JSArray [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]]
360foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
369foldJS :: (JS -> a) -> (a -> a -> a) -> a -> JS -> a
@@ -1843,29 +1852,9 @@ translateExpression (SApp tc name vars)
1843translateExpression (SOp op vars)
1852translateExpression (SOp op vars)
1844 | LNoOp <- op = JSVar (last vars)
1853 | LNoOp <- op = JSVar (last vars)
1846− | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1855+ | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1847−
1856+ | (LZExt (ITFixed IT16) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1848− | (LLSHR (ITFixed IT8)) <- op
1857+ | (LZExt (ITFixed IT32) ITNative) <- op = jsUnPackBits $ JSVar (last vars)
1849− , (lhs:rhs:_) <- vars =
1851− JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1854− | (LLSHR (ITFixed IT16)) <- op
1855− , (lhs:rhs:_) <- vars =
1857− JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1860− | (LLSHR (ITFixed IT32)) <- op
1861− , (lhs:rhs:_) <- vars =
1863− JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1866− | (LLSHR (ITFixed IT64)) <- op
1867− , (lhs:rhs:_) <- vars =
1868− jsMeth (JSVar lhs) "shiftRight" [JSVar rhs]
1870 | (LZExt _ ITBig) <- op = jsBigInt $ jsCall "String" [JSVar (last vars)]
1859 | (LZExt _ ITBig) <- op = jsBigInt $ jsCall "String" [JSVar (last vars)]
1871 | (LPlus (ATInt ITBig)) <- op
1860 | (LPlus (ATInt ITBig)) <- op
@@ -1920,19 +1909,19 @@ translateExpression (SOp op vars)
1921 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1910 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1922 , (arg:_) <- vars =
1911 , (arg:_) <- vars =
1923− jsPackBits8 (
1912+ jsPackUBits8 (
1924 JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFF))
1913 JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFF))
1927 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1916 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1928 , (arg:_) <- vars =
1917 , (arg:_) <- vars =
1929− jsPackBits16 (
1918+ jsPackUBits16 (
1930 JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFFFF))
1919 JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFFFF))
1933 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1922 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1934 , (arg:_) <- vars =
1923 , (arg:_) <- vars =
1935− jsPackBits32 (
1924+ jsPackUBits32 (
1936 jsMeth (jsMeth (JSVar arg) "and" [
1925 jsMeth (jsMeth (JSVar arg) "and" [
1937 jsBigInt (JSString $ show 0xFFFFFFFF)
1926 jsBigInt (JSString $ show 0xFFFFFFFF)
1938 ]) "intValue" []
1927 ]) "intValue" []
@@ -1944,21 +1933,67 @@ translateExpression (SOp op vars)
1944 jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1933 jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1947− | (LAnd (ITFixed IT8)) <- op
1936+ | (LLSHR (ITFixed IT8)) <- op
1948 , (lhs:rhs:_) <- vars =
1937 , (lhs:rhs:_) <- vars =
1949− jsPackBits8 (
1938+ jsPackUBits8 (
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 =
1950 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1985 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1953− | (LAnd (ITFixed IT16)) <- op
1988+ | (LAnd (ITFixed IT16)) <- op
1954 , (lhs:rhs:_) <- vars =
1989 , (lhs:rhs:_) <- vars =
1955− jsPackBits16 (
1990+ jsPackUBits16 (
1956 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1991 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1959− | (LAnd (ITFixed IT32)) <- op
1994+ | (LAnd (ITFixed IT32)) <- op
1960 , (lhs:rhs:_) <- vars =
1995 , (lhs:rhs:_) <- vars =
1961− jsPackBits32 (
1996+ jsPackUBits32 (
1962 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1997 JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
@@ -1966,12 +2001,331 @@ translateExpression (SOp op vars)
1966 , (lhs:rhs:_) <- vars =
2001 , (lhs:rhs:_) <- vars =
1967 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))
1969 | (LPlus (ATInt (ITFixed IT64))) <- op
2066 | (LPlus (ATInt (ITFixed IT64))) <- op
1970 , (lhs:rhs:_) <- vars =
2067 , (lhs:rhs:_) <- vars =
1971 jsMeth (jsMeth (JSVar lhs) "add" [JSVar rhs]) "and" [
2068 jsMeth (jsMeth (JSVar lhs) "add" [JSVar rhs]) "and" [
1972 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" []
1975 | (LPlus _) <- op
2329 | (LPlus _) <- op
1976 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
2330 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
1977 | (LMinus _) <- op
2331 | (LMinus _) <- op