on master help sign in
Merge pull request #1081 from raichoo/javascript
296b3eeEdwin Brady
CHANGELOG+1
@@ -1,6 +1,7 @@
1New in 0.9.13:
1New in 0.9.13:
2--------------
2--------------
3* IDE support for retrieving structured information about metavariables
3* IDE support for retrieving structured information about metavariables
4+* Experimental Bits support for JavaScript
4
5
5New in 0.9.12:
6New in 0.9.12:
6--------------
7--------------
src/IRTS/CodegenJavaScript.hs+423−23
@@ -267,9 +267,9 @@ compileJS (JSWhile cond body) =
267 ++ "\n}"
267 ++ "\n}"
268
268
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 ++ "\")"
274
274
275
275
@@ -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)) []
345
345
346+jsUnPackBits :: JS -> JS
347+jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
348+
349+
350+jsPackUBits8 :: JS -> JS
351+jsPackUBits8 js = JSNew "Uint8Array" [JSArray [js]]
352+
353+jsPackUBits16 :: JS -> JS
354+jsPackUBits16 js = JSNew "Uint16Array" [JSArray [js]]
355+
356+jsPackUBits32 :: JS -> JS
357+jsPackUBits32 js = JSNew "Uint32Array" [JSArray [js]]
358+
359+jsPackSBits8 :: JS -> JS
360+jsPackSBits8 js = JSNew "Int8Array" [JSArray [js]]
361+
362+jsPackSBits16 :: JS -> JS
363+jsPackSBits16 js = JSNew "Int16Array" [JSArray [js]]
364+
365+jsPackSBits32 :: JS -> JS
366+jsPackSBits32 js = JSNew "Int32Array" [JSArray [js]]
367+
346
368
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)
1832
1854
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
1837−
1838− | (LLSHR (ITFixed IT16)) <- op
1839− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1840−
1841− | (LLSHR (ITFixed IT32)) <- op
1842− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" lhs rhs
1843−
1844− | (LLSHR (ITFixed IT64)) <- op
1845− , (lhs:rhs:_) <- vars =
1846− jsMeth (JSVar lhs) "shiftRight" [JSVar rhs]
1847
1858
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)
1898
1909
1899 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1910 | (LTrunc (ITFixed IT16) (ITFixed IT8)) <- op
1900 , (arg:_) <- vars =
1911 , (arg:_) <- vars =
1912+ jsPackUBits8 (
1901− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFF))
1913+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFF))
1914+ )
1902
1915
1903 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1916 | (LTrunc (ITFixed IT32) (ITFixed IT16)) <- op
1904 , (arg:_) <- vars =
1917 , (arg:_) <- vars =
1918+ jsPackUBits16 (
1905− JSParens $ JSBinOp "&" (JSVar arg) (JSNum (JSInt 0xFFFF))
1919+ JSBinOp "&" (jsUnPackBits $ JSVar arg) (JSNum (JSInt 0xFFFF))
1920+ )
1906
1921
1907 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1922 | (LTrunc (ITFixed IT64) (ITFixed IT32)) <- op
1908 , (arg:_) <- vars =
1923 , (arg:_) <- vars =
1924+ jsPackUBits32 (
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" []
1928+ )
1912
1929
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)
1934+ ]
1935+
1936+ | (LLSHR (ITFixed IT8)) <- op
1937+ , (lhs:rhs:_) <- vars =
1938+ jsPackUBits8 (
1939+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1940+ )
1941+
1942+ | (LLSHR (ITFixed IT16)) <- op
1943+ , (lhs:rhs:_) <- vars =
1944+ jsPackUBits16 (
1945+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1946+ )
1947+
1948+ | (LLSHR (ITFixed IT32)) <- op
1949+ , (lhs:rhs:_) <- vars =
1950+ jsPackUBits32 (
1951+ JSBinOp ">>" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1952+ )
1953+
1954+ | (LLSHR (ITFixed IT64)) <- op
1955+ , (lhs:rhs:_) <- vars =
1956+ jsMeth (JSVar lhs) "shiftRight" [JSVar rhs]
1957+
1958+ | (LSHL (ITFixed IT8)) <- op
1959+ , (lhs:rhs:_) <- vars =
1960+ jsPackUBits8 (
1961+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1962+ )
1963+
1964+ | (LSHL (ITFixed IT16)) <- op
1965+ , (lhs:rhs:_) <- vars =
1966+ jsPackUBits16 (
1967+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1968+ )
1969+
1970+ | (LSHL (ITFixed IT32)) <- op
1971+ , (lhs:rhs:_) <- vars =
1972+ jsPackUBits32 (
1973+ JSBinOp "<<" (jsUnPackBits $ JSVar lhs) (jsUnPackBits $ JSVar rhs)
1974+ )
1975+
1976+ | (LSHL (ITFixed IT64)) <- op
1977+ , (lhs:rhs:_) <- vars =
1978+ jsMeth (jsMeth (JSVar lhs) "shiftLeft" [JSVar rhs]) "and" [
1979+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
1917 ]
1980 ]
1918
1981
1982+ | (LAnd (ITFixed IT8)) <- op
1983+ , (lhs:rhs:_) <- vars =
1984+ jsPackUBits8 (
1985+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1986+ )
1987+
1988+ | (LAnd (ITFixed IT16)) <- op
1989+ , (lhs:rhs:_) <- vars =
1990+ jsPackUBits16 (
1991+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1992+ )
1993+
1994+ | (LAnd (ITFixed IT32)) <- op
1995+ , (lhs:rhs:_) <- vars =
1996+ jsPackUBits32 (
1997+ JSBinOp "&" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
1998+ )
1999+
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]
1922
2003
2004+ | (LOr (ITFixed IT8)) <- op
2005+ , (lhs:rhs:_) <- vars =
2006+ jsPackUBits8 (
2007+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2008+ )
2009+
2010+ | (LOr (ITFixed IT16)) <- op
2011+ , (lhs:rhs:_) <- vars =
2012+ jsPackUBits16 (
2013+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2014+ )
2015+
2016+ | (LOr (ITFixed IT32)) <- op
2017+ , (lhs:rhs:_) <- vars =
2018+ jsPackUBits32 (
2019+ JSBinOp "|" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2020+ )
2021+
2022+ | (LOr (ITFixed IT64)) <- op
2023+ , (lhs:rhs:_) <- vars =
2024+ jsMeth (JSVar lhs) "or" [JSVar rhs]
2025+
2026+ | (LXOr (ITFixed IT8)) <- op
2027+ , (lhs:rhs:_) <- vars =
2028+ jsPackUBits8 (
2029+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2030+ )
2031+
2032+ | (LXOr (ITFixed IT16)) <- op
2033+ , (lhs:rhs:_) <- vars =
2034+ jsPackUBits16 (
2035+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2036+ )
2037+
2038+ | (LXOr (ITFixed IT32)) <- op
2039+ , (lhs:rhs:_) <- vars =
2040+ jsPackUBits32 (
2041+ JSBinOp "^" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2042+ )
2043+
2044+ | (LXOr (ITFixed IT64)) <- op
2045+ , (lhs:rhs:_) <- vars =
2046+ jsMeth (JSVar lhs) "xor" [JSVar rhs]
2047+
2048+ | (LPlus (ATInt (ITFixed IT8))) <- op
2049+ , (lhs:rhs:_) <- vars =
2050+ jsPackUBits8 (
2051+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2052+ )
2053+
2054+ | (LPlus (ATInt (ITFixed IT16))) <- op
2055+ , (lhs:rhs:_) <- vars =
2056+ jsPackUBits16 (
2057+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2058+ )
2059+
2060+ | (LPlus (ATInt (ITFixed IT32))) <- op
2061+ , (lhs:rhs:_) <- vars =
2062+ jsPackUBits32 (
2063+ JSBinOp "+" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2064+ )
2065+
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)
1927 ]
2070 ]
1928
2071
2072+ | (LMinus (ATInt (ITFixed IT8))) <- op
2073+ , (lhs:rhs:_) <- vars =
2074+ jsPackUBits8 (
2075+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2076+ )
2077+
2078+ | (LMinus (ATInt (ITFixed IT16))) <- op
2079+ , (lhs:rhs:_) <- vars =
2080+ jsPackUBits16 (
2081+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2082+ )
2083+
2084+ | (LMinus (ATInt (ITFixed IT32))) <- op
2085+ , (lhs:rhs:_) <- vars =
2086+ jsPackUBits32 (
2087+ JSBinOp "-" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2088+ )
2089+
2090+ | (LMinus (ATInt (ITFixed IT64))) <- op
2091+ , (lhs:rhs:_) <- vars =
2092+ jsMeth (jsMeth (JSVar lhs) "subtract" [JSVar rhs]) "and" [
2093+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2094+ ]
2095+
2096+ | (LTimes (ATInt (ITFixed IT8))) <- op
2097+ , (lhs:rhs:_) <- vars =
2098+ jsPackUBits8 (
2099+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2100+ )
2101+
2102+ | (LTimes (ATInt (ITFixed IT16))) <- op
2103+ , (lhs:rhs:_) <- vars =
2104+ jsPackUBits16 (
2105+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2106+ )
2107+
2108+ | (LTimes (ATInt (ITFixed IT32))) <- op
2109+ , (lhs:rhs:_) <- vars =
2110+ jsPackUBits32 (
2111+ JSBinOp "*" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2112+ )
2113+
2114+ | (LTimes (ATInt (ITFixed IT64))) <- op
2115+ , (lhs:rhs:_) <- vars =
2116+ jsMeth (jsMeth (JSVar lhs) "multiply" [JSVar rhs]) "and" [
2117+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2118+ ]
2119+
2120+ | (LEq (ATInt (ITFixed IT8))) <- op
2121+ , (lhs:rhs:_) <- vars =
2122+ jsPackUBits8 (
2123+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2124+ )
2125+
2126+ | (LEq (ATInt (ITFixed IT16))) <- op
2127+ , (lhs:rhs:_) <- vars =
2128+ jsPackUBits16 (
2129+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2130+ )
2131+
2132+ | (LEq (ATInt (ITFixed IT32))) <- op
2133+ , (lhs:rhs:_) <- vars =
2134+ jsPackUBits32 (
2135+ JSBinOp "==" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2136+ )
2137+
2138+ | (LEq (ATInt (ITFixed IT64))) <- op
2139+ , (lhs:rhs:_) <- vars =
2140+ jsMeth (jsMeth (JSVar lhs) "equals" [JSVar rhs]) "and" [
2141+ jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
2142+ ]
2143+
2144+ | (LLt (ITFixed IT8)) <- op
2145+ , (lhs:rhs:_) <- vars =
2146+ jsPackUBits8 (
2147+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2148+ )
2149+
2150+ | (LLt (ITFixed IT16)) <- op
2151+ , (lhs:rhs:_) <- vars =
2152+ jsPackUBits16 (
2153+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2154+ )
2155+
2156+ | (LLt (ITFixed IT32)) <- op
2157+ , (lhs:rhs:_) <- vars =
2158+ jsPackUBits32 (
2159+ JSBinOp "<" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2160+ )
2161+
2162+ | (LLt (ITFixed IT64)) <- op
2163+ , (lhs:rhs:_) <- vars = invokeMeth lhs "lesser" [rhs]
2164+
2165+ | (LLe (ITFixed IT8)) <- op
2166+ , (lhs:rhs:_) <- vars =
2167+ jsPackUBits8 (
2168+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2169+ )
2170+
2171+ | (LLe (ITFixed IT16)) <- op
2172+ , (lhs:rhs:_) <- vars =
2173+ jsPackUBits16 (
2174+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2175+ )
2176+
2177+ | (LLe (ITFixed IT32)) <- op
2178+ , (lhs:rhs:_) <- vars =
2179+ jsPackUBits32 (
2180+ JSBinOp "<=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2181+ )
2182+
2183+ | (LLe (ITFixed IT64)) <- op
2184+ , (lhs:rhs:_) <- vars = invokeMeth lhs "lesserOrEquals" [rhs]
2185+
2186+ | (LGt (ITFixed IT8)) <- op
2187+ , (lhs:rhs:_) <- vars =
2188+ jsPackUBits8 (
2189+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2190+ )
2191+
2192+ | (LGt (ITFixed IT16)) <- op
2193+ , (lhs:rhs:_) <- vars =
2194+ jsPackUBits16 (
2195+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2196+ )
2197+ | (LGt (ITFixed IT32)) <- op
2198+ , (lhs:rhs:_) <- vars =
2199+ jsPackUBits32 (
2200+ JSBinOp ">" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2201+ )
2202+
2203+ | (LGt (ITFixed IT64)) <- op
2204+ , (lhs:rhs:_) <- vars = invokeMeth lhs "greater" [rhs]
2205+
2206+ | (LGe (ITFixed IT8)) <- op
2207+ , (lhs:rhs:_) <- vars =
2208+ jsPackUBits8 (
2209+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2210+ )
2211+
2212+ | (LGe (ITFixed IT16)) <- op
2213+ , (lhs:rhs:_) <- vars =
2214+ jsPackUBits16 (
2215+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2216+ )
2217+ | (LGe (ITFixed IT32)) <- op
2218+ , (lhs:rhs:_) <- vars =
2219+ jsPackUBits32 (
2220+ JSBinOp ">=" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2221+ )
2222+
2223+ | (LGe (ITFixed IT64)) <- op
2224+ , (lhs:rhs:_) <- vars = invokeMeth lhs "greaterOrEquals" [rhs]
2225+
2226+ | (LUDiv (ITFixed IT8)) <- op
2227+ , (lhs:rhs:_) <- vars =
2228+ jsPackUBits8 (
2229+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2230+ )
2231+
2232+ | (LUDiv (ITFixed IT16)) <- op
2233+ , (lhs:rhs:_) <- vars =
2234+ jsPackUBits16 (
2235+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2236+ )
2237+
2238+ | (LUDiv (ITFixed IT32)) <- op
2239+ , (lhs:rhs:_) <- vars =
2240+ jsPackUBits32 (
2241+ JSBinOp "/" (jsUnPackBits (JSVar lhs)) (jsUnPackBits (JSVar rhs))
2242+ )
2243+
2244+ | (LUDiv (ITFixed IT64)) <- op
2245+ , (lhs:rhs:_) <- vars = invokeMeth lhs "divide" [rhs]
2246+
2247+ | (LSDiv (ATInt (ITFixed IT8))) <- op
2248+ , (lhs:rhs:_) <- vars =
2249+ jsPackSBits8 (
2250+ JSBinOp "/" (
2251+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar lhs)
2252+ ) (
2253+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar rhs)
2254+ )
2255+ )
2256+
2257+ | (LSDiv (ATInt (ITFixed IT16))) <- op
2258+ , (lhs:rhs:_) <- vars =
2259+ jsPackSBits16 (
2260+ JSBinOp "/" (
2261+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar lhs)
2262+ ) (
2263+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar rhs)
2264+ )
2265+ )
2266+
2267+ | (LSDiv (ATInt (ITFixed IT32))) <- op
2268+ , (lhs:rhs:_) <- vars =
2269+ jsPackSBits32 (
2270+ JSBinOp "/" (
2271+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar lhs)
2272+ ) (
2273+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar rhs)
2274+ )
2275+ )
2276+
2277+ | (LSDiv (ATInt (ITFixed IT64))) <- op
2278+ , (lhs:rhs:_) <- vars = invokeMeth lhs "divide" [rhs]
2279+
2280+ | (LSRem (ATInt (ITFixed IT8))) <- op
2281+ , (lhs:rhs:_) <- vars =
2282+ jsPackSBits8 (
2283+ JSBinOp "%" (
2284+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar lhs)
2285+ ) (
2286+ jsUnPackBits $ jsPackSBits8 $ jsUnPackBits (JSVar rhs)
2287+ )
2288+ )
2289+
2290+ | (LSRem (ATInt (ITFixed IT16))) <- op
2291+ , (lhs:rhs:_) <- vars =
2292+ jsPackSBits16 (
2293+ JSBinOp "%" (
2294+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar lhs)
2295+ ) (
2296+ jsUnPackBits $ jsPackSBits16 $ jsUnPackBits (JSVar rhs)
2297+ )
2298+ )
2299+
2300+ | (LSRem (ATInt (ITFixed IT32))) <- op
2301+ , (lhs:rhs:_) <- vars =
2302+ jsPackSBits32 (
2303+ JSBinOp "%" (
2304+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar lhs)
2305+ ) (
2306+ jsUnPackBits $ jsPackSBits32 $ jsUnPackBits (JSVar rhs)
2307+ )
2308+ )
2309+
2310+ | (LSRem (ATInt (ITFixed IT64))) <- op
2311+ , (lhs:rhs:_) <- vars = invokeMeth lhs "mod" [rhs]
2312+
2313+ | (LCompl (ITFixed IT8)) <- op
2314+ , (arg:_) <- vars =
2315+ jsPackSBits8 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2316+
2317+ | (LCompl (ITFixed IT16)) <- op
2318+ , (arg:_) <- vars =
2319+ jsPackSBits16 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2320+
2321+ | (LCompl (ITFixed IT32)) <- op
2322+ , (arg:_) <- vars =
2323+ jsPackSBits32 $ JSPreOp "~" $ jsUnPackBits (JSVar arg)
2324+
2325+ | (LCompl (ITFixed IT64)) <- op
2326+ , (arg:_) <- vars =
2327+ invokeMeth arg "not" []
2328+
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