@@ -57,6 +57,7 @@ data CGConf = CGConf { header :: Text
57 , initialization :: CGStats -> Text
57 , initialization :: CGStats -> Text
58 , writeStrTemplate :: Text
58 , writeStrTemplate :: Text
59 , readStrTemplate :: Text
59 , readStrTemplate :: Text
60+ , extraRunTime :: String
@@ -99,6 +100,7 @@ codegenJs conf ci =
99 else return ""
100 else return ""
101 runtimeCommon <- TIO.readFile $ path </> "Runtime-common.js"
102 runtimeCommon <- TIO.readFile $ path </> "Runtime-common.js"
103+ extraRT <- TIO.readFile $ path </> (extraRunTime conf)
103 includes <- getIncludes $ includes ci
105 includes <- getIncludes $ includes ci
104 TIO.writeFile (outputFile ci) $ T.concat [ header conf
106 TIO.writeFile (outputFile ci) $ T.concat [ header conf
@@ -109,6 +111,7 @@ codegenJs conf ci =
109 , doPartials (partialApplications stats)
111 , doPartials (partialApplications stats)
110 , includes, "\n"
112 , includes, "\n"
111 , runtimeCommon, "\n"
113 , runtimeCommon, "\n"
112 , out, "\n"
115 , out, "\n"
114 , jsName (sMN 0 "runMain"), "();\n\n"
117 , jsName (sMN 0 "runMain"), "();\n\n"
@@ -474,8 +477,8 @@ cgConst (BI i) =
474cgConst (Ch c) = pure $ JsStr [c]
477cgConst (Ch c) = pure $ JsStr [c]
475cgConst (Str s) = pure $ JsStr s
478cgConst (Str s) = pure $ JsStr s
476cgConst (Fl f) = pure $ JsNum f
479cgConst (Fl f) = pure $ JsNum f
477−cgConst (B8 x) = pure $ JsForeign (T.pack $ "new Uint8Array([" ++ show x ++ "])") []
480+cgConst (B8 x) = pure $ JsForeign (T.pack $ show x ++ " & 0xFF") []
478−cgConst (B16 x) = pure $ JsForeign (T.pack $ "new Uint16Array([" ++ show x ++ "])") []
481+cgConst (B16 x) = pure $ JsForeign (T.pack $ show x ++ " & 0xFFFF") []
479cgConst (B32 x) = pure $ JsForeign (T.pack $ show x ++ "|0" ) []
482cgConst (B32 x) = pure $ JsForeign (T.pack $ show x ++ "|0" ) []
480cgConst (B64 x) =
483cgConst (B64 x) =
@@ -488,12 +491,11 @@ jsB2I :: JsAST -> JsAST
488jsB2I x = JsForeign "%0 ? 1|0 : 0|0" [x]
491jsB2I x = JsForeign "%0 ? 1|0 : 0|0" [x]
490cgOp :: PrimFn -> [JsAST] -> State CGBodyState JsAST
493cgOp :: PrimFn -> [JsAST] -> State CGBodyState JsAST
491−cgOp (LAnd (ITFixed IT8)) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] & %1[0] ])" [l,r]
492cgOp (LPlus ATFloat) [l, r] = pure $ JsBinOp "+" l r
494cgOp (LPlus ATFloat) [l, r] = pure $ JsBinOp "+" l r
493cgOp (LPlus (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) + %1.charCodeAt(0))" [l,r]
495cgOp (LPlus (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) + %1.charCodeAt(0))" [l,r]
494cgOp (LPlus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
496cgOp (LPlus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
495−cgOp (LPlus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] + %1[0] ])" [l,r]
497+cgOp (LPlus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 + %1 & 0xFF" [l,r]
496−cgOp (LPlus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "new Uint16Array([ %0[0] + %1[0] ])" [l,r]
498+cgOp (LPlus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 + %1 & 0xFFFF" [l,r]
497cgOp (LPlus (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
499cgOp (LPlus (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
498cgOp (LPlus (ATInt ITBig)) [l, r] =
500cgOp (LPlus (ATInt ITBig)) [l, r] =
@@ -503,25 +505,138 @@ cgOp (LPlus (ATInt (ITFixed IT64))) [l, r] =
504 setUsedITBig
506 setUsedITBig
505 pure $ JsForeign "%0.add(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
507 pure $ JsForeign "%0.add(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
506−cgOp (LLSHR (ITFixed IT8)) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] >> %1[0] ])" [l,r]
507−cgOp (LLSHR (ITFixed IT16)) [l, r] = pure $ JsForeign "new Uint16Array([ %0[0] >> %1[0] ])" [l,r]
508−cgOp (LLSHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
509−cgOp (LLSHR (ITFixed IT64)) [l, r] =
512− pure $ JsForeign "%0.shiftRight(%1)" [l,r]
513cgOp (LMinus ATFloat) [l, r] = pure $ JsBinOp "-" l r
508cgOp (LMinus ATFloat) [l, r] = pure $ JsBinOp "-" l r
509+cgOp (LMinus (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) - %1.charCodeAt(0))" [l,r]
514cgOp (LMinus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0-%1|0" [l,r]
510cgOp (LMinus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0-%1|0" [l,r]
511+cgOp (LMinus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 - %1 & 0xFF" [l,r]
512+cgOp (LMinus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 - %1 & 0xFFFF" [l,r]
513+cgOp (LMinus (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0-%1|0" [l,r]
515cgOp (LMinus (ATInt ITBig)) [l, r] =
514cgOp (LMinus (ATInt ITBig)) [l, r] =
517 setUsedITBig
516 setUsedITBig
518 pure $ JsMethod l "subtract" [r]
517 pure $ JsMethod l "subtract" [r]
518+cgOp (LMinus (ATInt (ITFixed IT64))) [l, r] =
521+ pure $ JsForeign "%0.subtract(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
519cgOp (LTimes ATFloat) [l, r] = pure $ JsBinOp "*" l r
522cgOp (LTimes ATFloat) [l, r] = pure $ JsBinOp "*" l r
523+cgOp (LTimes (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) * %1.charCodeAt(0))" [l,r]
520cgOp (LTimes (ATInt ITNative)) [l, r] = pure $ JsForeign "%0*%1|0" [l,r]
524cgOp (LTimes (ATInt ITNative)) [l, r] = pure $ JsForeign "%0*%1|0" [l,r]
525+cgOp (LTimes (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 * %1 & 0xFF" [l,r]
526+cgOp (LTimes (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 * %1 & 0xFFFF" [l,r]
527+cgOp (LTimes (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0*%1|0" [l,r]
521cgOp (LTimes (ATInt ITBig)) [l, r] =
528cgOp (LTimes (ATInt ITBig)) [l, r] =
523 setUsedITBig
530 setUsedITBig
524 pure $ JsMethod l "multiply" [r]
531 pure $ JsMethod l "multiply" [r]
532+cgOp (LTimes (ATInt (ITFixed IT64))) [l, r] =
535+ pure $ JsForeign "%0.multiply(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
536+cgOp (LUDiv (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
537+cgOp (LUDiv (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
538+cgOp (LUDiv (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) / (%1>>>0) |0" [l,r]
539+cgOp (LUDiv (ITFixed IT64)) [l, r] =
542+ pure $ JsForeign "%0.divide(%1)" [l,r]
543+cgOp (LSDiv ATFloat) [l,r] = pure $ JsBinOp "/" l r
544+cgOp (LSDiv (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
545+cgOp (LSDiv (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
546+cgOp (LSDiv (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0 / %1 |0" [l,r]
547+cgOp (LSDiv (ATInt (ITFixed IT64))) [l, r] =
550+ pure $ JsForeign "%0.divide(%1)" [l,r]
551+cgOp (LSDiv (ATInt ITNative)) [l,r] = pure $ JsForeign "%0/%1|0" [l, r]
552+cgOp (LSDiv (ATInt ITBig)) [l,r] =
555+ pure $ JsMethod l "divide" [r]
556+cgOp (LURem (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
557+cgOp (LURem (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
558+cgOp (LURem (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) % (%1>>>0) |0" [l,r]
559+cgOp (LURem (ITFixed IT64)) [l,r] =
562+ pure $ JsMethod l "remainder" [r]
563+cgOp (LSRem ATFloat) [l,r] = pure $ JsBinOp "%" l r
564+cgOp (LSRem (ATInt ITNative)) [l,r] = pure $ JsForeign "%0 % %1 |0" [l,r]
565+cgOp (LSRem (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
566+cgOp (LSRem (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
567+cgOp (LSRem (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0 % %1 |0" [l,r]
568+cgOp (LSRem (ATInt (ITFixed IT64))) [l, r] =
571+ pure $ JsMethod l "remainder" [r]
572+cgOp (LSRem (ATInt ITBig)) [l,r] =
575+ pure $ JsMethod l "remainder" [r]
576+cgOp (LAnd ITNative) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
577+cgOp (LAnd (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
578+cgOp (LAnd (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
579+cgOp (LAnd (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
580+cgOp (LAnd (ITFixed IT64)) [l,r] =
583+ pure $ JsMethod l "and" [r]
584+cgOp (LAnd ITBig) [l,r] =
587+ pure $ JsMethod l "and" [r]
588+cgOp (LOr ITNative) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
589+cgOp (LOr (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
590+cgOp (LOr (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
591+cgOp (LOr (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
592+cgOp (LOr (ITFixed IT64)) [l,r] =
595+ pure $ JsMethod l "or" [r]
596+cgOp (LOr ITBig) [l,r] =
599+ pure $ JsMethod l "or" [r]
600+cgOp (LXOr ITNative) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
601+cgOp (LXOr (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
602+cgOp (LXOr (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
603+cgOp (LXOr (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
604+cgOp (LXOr (ITFixed IT64)) [l,r] =
607+ pure $ JsMethod l "xor" [r]
608+cgOp (LXOr ITBig) [l,r] =
611+ pure $ JsMethod l "xor" [r]
612+cgOp (LSHL ITNative) [l, r] = pure $ JsForeign "%0 << %1 |0" [l,r]
613+cgOp (LSHL (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 << %1 & 0xFF" [l,r]
614+cgOp (LSHL (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 << %1 & 0xFFFF" [l,r]
615+cgOp (LSHL (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 << %1 |0" [l,r]
616+cgOp (LTimes (ATInt (ITFixed IT64))) [l, r] =
619+ pure $ JsForeign "%0.shiftLeft(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
620+cgOp (LSHL ITBig) [l,r] =
623+ pure $ JsMethod l "shiftLeft" [r]
624+cgOp (LLSHR ITNative) [l, r] = pure $ JsForeign "%0 >> %1 |0" [l,r]
625+cgOp (LLSHR (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
626+cgOp (LLSHR (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
627+cgOp (LLSHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
628+cgOp (LLSHR (ITFixed IT64)) [l, r] =
631+ pure $ JsForeign "%0.shiftRight(%1)" [l,r]
632+cgOp (LASHR ITNative) [l, r] = pure $ JsForeign "%0 >> %1 |0" [l,r]
633+cgOp (LASHR (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
634+cgOp (LASHR (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
635+cgOp (LASHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
636+cgOp (LASHR (ITFixed IT64)) [l, r] =
639+ pure $ JsForeign "%0.shiftRight(%1)" [l,r]
525cgOp (LEq ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
640cgOp (LEq ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
526cgOp (LEq (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
641cgOp (LEq (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
527cgOp (LEq (ATInt ITChar)) [l,r] = pure $ jsB2I $ JsBinOp "==" l r
642cgOp (LEq (ATInt ITChar)) [l,r] = pure $ jsB2I $ JsBinOp "==" l r
@@ -529,6 +644,41 @@ cgOp (LEq (ATInt ITBig)) [l, r] =
530 setUsedITBig
645 setUsedITBig
531 pure $ jsB2I $ JsMethod l "equals" [r]
646 pure $ jsB2I $ JsMethod l "equals" [r]
647+cgOp (LEq (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
648+cgOp (LEq (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
649+cgOp (LEq (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
650+cgOp (LEq (ATInt (ITFixed IT64))) [l, r] =
653+ pure $ jsB2I $ JsMethod l "equals" [r]
654+cgOp (LLt (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 < %1" [l,r]
655+cgOp (LLt (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 < %1" [l,r]
656+cgOp (LLt (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) < (%1>>>0)" [l,r]
657+cgOp (LLt (ITFixed IT64)) [l, r] =
660+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
661+cgOp (LLe (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 <= %1" [l,r]
662+cgOp (LLe (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 <= %1" [l,r]
663+cgOp (LLe (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) <= (%1>>>0)" [l,r]
664+cgOp (LLe (ITFixed IT64)) [l, r] =
667+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
668+cgOp (LGt (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 > %1" [l,r]
669+cgOp (LGt (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 > %1" [l,r]
670+cgOp (LGt (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) > (%1>>>0)" [l,r]
671+cgOp (LGt (ITFixed IT64)) [l, r] =
674+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
675+cgOp (LGe (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >= %1" [l,r]
676+cgOp (LGe (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >= %1" [l,r]
677+cgOp (LGe (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) >= (%1>>>0)" [l,r]
678+cgOp (LGe (ITFixed IT64)) [l, r] =
681+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
532cgOp (LSLt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
682cgOp (LSLt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
533cgOp (LSLt (ATInt ITChar)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
683cgOp (LSLt (ATInt ITChar)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
534cgOp (LSLt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
684cgOp (LSLt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
@@ -536,101 +686,141 @@ cgOp (LSLt (ATInt ITBig)) [l, r] =
537 setUsedITBig
687 setUsedITBig
538 pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
688 pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
689+cgOp (LSLt (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
690+cgOp (LSLt (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
691+cgOp (LSLt (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
692+cgOp (LSLt (ATInt (ITFixed IT64))) [l, r] =
695+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
539cgOp (LSLe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
696cgOp (LSLe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
540cgOp (LSLe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
697cgOp (LSLe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
541cgOp (LSLe (ATInt ITBig)) [l, r] =
698cgOp (LSLe (ATInt ITBig)) [l, r] =
543 setUsedITBig
700 setUsedITBig
544 pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
701 pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
702+cgOp (LSLe (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
703+cgOp (LSLe (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
704+cgOp (LSLe (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
705+cgOp (LSLe (ATInt (ITFixed IT64))) [l, r] =
708+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
545cgOp (LSGt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
709cgOp (LSGt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
546cgOp (LSGt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
710cgOp (LSGt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
547cgOp (LSGt (ATInt ITBig)) [l, r] =
711cgOp (LSGt (ATInt ITBig)) [l, r] =
549 setUsedITBig
713 setUsedITBig
550 pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
714 pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
715+cgOp (LSGt (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
716+cgOp (LSGt (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
717+cgOp (LSGt (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
718+cgOp (LSGt (ATInt (ITFixed IT64))) [l, r] =
721+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
551cgOp (LSGe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
722cgOp (LSGe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
552cgOp (LSGe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
723cgOp (LSGe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
553cgOp (LSGe (ATInt ITBig)) [l, r] =
724cgOp (LSGe (ATInt ITBig)) [l, r] =
555 setUsedITBig
726 setUsedITBig
556 pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
727 pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
557−cgOp LStrEq [l,r] = pure $ jsB2I $ JsBinOp "==" l r
728+cgOp (LSGe (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
558−cgOp LStrLen [x] = pure $ JsForeign "%0.length" [x]
729+cgOp (LSGe (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
559−cgOp LStrHead [x] = pure $ JsArrayProj (JsInt 0) x
560−cgOp LStrIndex [x, y] = pure $ JsArrayProj y x
561−cgOp LStrTail [x] = pure $ JsMethod x "slice" [JsInt 1]
562−cgOp LStrLt [l, r] = pure $ jsB2I $ JsBinOp "<" l r
730+cgOp (LSGe (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
563−cgOp LStrRev [x] = pure $ JsForeign "%0.split('').reverse().join('')" [x]
731+cgOp (LSGe (ATInt (ITFixed IT64))) [l, r] =
564−cgOp (LFloatStr) [x] = pure $ JsApp "String" [x]
565−cgOp (LIntStr ITNative) [x] = pure $ JsApp "String" [x]
566−cgOp (LIntStr ITBig) [x] =
568 setUsedITBig
733 setUsedITBig
569− pure $ JsForeign "%0.toString()" [x]
734+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
570−cgOp (LFloatInt ITNative) [x] = pure $ JsForeign "%0|0" [x]
735+cgOp (LSExt ITNative ITBig) [x] =
738+ pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
571−cgOp (LStrInt ITNative) [x] = pure $ JsForeign "parseInt(%0)|0" [x]
739+cgOp (LZExt (ITFixed IT8) ITNative) [x] = pure x
572−cgOp (LStrFloat) [x] = pure $ JsApp "parseFloat" [x]
740+cgOp (LZExt (ITFixed IT16) ITNative) [x] = pure x
573−cgOp (LChInt ITNative) [x] = pure $ JsForeign "%0.charCodeAt(0)|0" [x]
741+cgOp (LZExt (ITFixed IT32) ITNative) [x] = pure x
574−cgOp (LIntCh ITNative) [x] = pure $ JsApp "String.fromCharCode" [x]
742+cgOp (LZExt ITNative ITBig) [x] =
745+ pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
575cgOp (LTrunc ITBig ITNative) [x] =
746cgOp (LTrunc ITBig ITNative) [x] =
577 setUsedITBig
748 setUsedITBig
578 pure $ JsForeign "%0.intValue()|0" [x]
749 pure $ JsForeign "%0.intValue()|0" [x]
579−cgOp (LTrunc (ITFixed IT16) (ITFixed IT8)) [x] = pure $ JsForeign "new Uint8Array([ %0[0] ])" [x]
750+cgOp (LTrunc (ITFixed IT16) (ITFixed IT8)) [x] = pure $ JsForeign "%0 & 0xFF" [x]
580−cgOp (LTrunc (ITFixed IT32) (ITFixed IT8)) [x] = pure $ JsForeign "new Uint8Array([ %0 ])" [x]
751+cgOp (LTrunc (ITFixed IT32) (ITFixed IT8)) [x] = pure $ JsForeign "%0 & 0xFF" [x]
581cgOp (LTrunc (ITFixed IT64) (ITFixed IT8)) [x] =
752cgOp (LTrunc (ITFixed IT64) (ITFixed IT8)) [x] =
583 setUsedITBig
754 setUsedITBig
584− pure $ JsForeign "new Uint8Array([ %0.and(new jsbn.BigInteger(%1)).intValue() ])" [x, JsStr $ show 0xFF]
755+ pure $ JsForeign "%0.intValue() & 0xFF" [x]
585−cgOp (LSExt ITNative ITBig) [x] =
756+cgOp (LTrunc (ITFixed IT32) (ITFixed IT16)) [x] = pure $ JsForeign "%0 & 0xFFFF" [x]
757+cgOp (LTrunc (ITFixed IT64) (ITFixed IT16)) [x] =
587 setUsedITBig
759 setUsedITBig
588− pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
760+ pure $ JsForeign "%0.intValue() & 0xFFFF" [x]
589−cgOp (LZExt (ITFixed IT8) ITNative) [x] = pure $ JsForeign "%0[0]" [x]
761+cgOp (LTrunc (ITFixed IT64) (ITFixed IT32)) [x] =
590−cgOp (LZExt ITNative ITBig) [x] =
592 setUsedITBig
763 setUsedITBig
593− pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
764+ pure $ JsForeign "%0.intValue() & 0xFFFFFFFF" [x]
765+cgOp (LTrunc ITBig (ITFixed IT64)) [x] =
768+ pure $ JsForeign "%0.and(new jsbn.BigInteger(%1))" [x, JsStr $ show 0xFFFFFFFFFFFFFFFF]
769+cgOp LStrConcat [l,r] = pure $ JsBinOp "+" l r
770+cgOp LStrLt [l, r] = pure $ jsB2I $ JsBinOp "<" l r
771+cgOp LStrEq [l,r] = pure $ jsB2I $ JsBinOp "==" l r
772+cgOp LStrLen [x] = pure $ JsForeign "%0.length" [x]
594cgOp (LIntFloat ITNative) [x] = pure $ x
773cgOp (LIntFloat ITNative) [x] = pure $ x
595cgOp (LIntFloat ITBig) [x] =
774cgOp (LIntFloat ITBig) [x] =
597 setUsedITBig
776 setUsedITBig
598 pure $ JsForeign "%0.intValue()" [x]
777 pure $ JsForeign "%0.intValue()" [x]
599−cgOp LFACos [x] = pure $ JsApp "Math.acos" [x]
778+cgOp (LFloatInt ITNative) [x] = pure $ JsForeign "%0|0" [x]
600−cgOp LFATan [x] = pure $ JsApp "Math.atan" [x]
779+cgOp (LIntStr ITNative) [x] = pure $ JsApp "String" [x]
780+cgOp (LIntStr ITBig) [x] =
783+ pure $ JsForeign "%0.toString()" [x]
784+cgOp (LStrInt ITNative) [x] = pure $ JsForeign "parseInt(%0)|0" [x]
785+cgOp (LStrInt ITBig) [x] =
788+ pure $ JsForeign "new jsbn.BigInteger(%0)" [x]
789+cgOp (LFloatStr) [x] = pure $ JsApp "String" [x]
790+cgOp (LStrFloat) [x] = pure $ JsApp "parseFloat" [x]
791+cgOp (LChInt ITNative) [x] = pure $ JsForeign "%0.charCodeAt(0)|0" [x]
792+cgOp (LIntCh ITNative) [x] = pure $ JsApp "String.fromCharCode" [x]
601−cgOp LFCos [x] = pure $ JsApp "Math.cos" [x]
793+cgOp LFExp [x] = pure $ JsApp "Math.exp" [x]
602−cgOp LFFloor [x] = pure $ JsApp "Math.floor" [x]
794+cgOp LFLog [x] = pure $ JsApp "Math.log" [x]
603cgOp LFSin [x] = pure $ JsApp "Math.sin" [x]
795cgOp LFSin [x] = pure $ JsApp "Math.sin" [x]
796+cgOp LFCos [x] = pure $ JsApp "Math.cos" [x]
604cgOp LFTan [x] = pure $ JsApp "Math.tan" [x]
797cgOp LFTan [x] = pure $ JsApp "Math.tan" [x]
605cgOp LFASin [x] = pure $ JsApp "Math.asin" [x]
798cgOp LFASin [x] = pure $ JsApp "Math.asin" [x]
606−cgOp LFCeil [x] = pure $ JsApp "Math.ceil" [x]
799+cgOp LFACos [x] = pure $ JsApp "Math.acos" [x]
607−cgOp LFExp [x] = pure $ JsApp "Math.exp" [x]
800+cgOp LFATan [x] = pure $ JsApp "Math.atan" [x]
608−cgOp LFLog [x] = pure $ JsApp "Math.log" [x]
609cgOp LFSqrt [x] = pure $ JsApp "Math.sqrt" [x]
801cgOp LFSqrt [x] = pure $ JsApp "Math.sqrt" [x]
802+cgOp LFFloor [x] = pure $ JsApp "Math.floor" [x]
803+cgOp LFCeil [x] = pure $ JsApp "Math.ceil" [x]
610cgOp LFNegate [x] = pure $ JsForeign "-%0" [x]
804cgOp LFNegate [x] = pure $ JsForeign "-%0" [x]
611−cgOp (LSDiv ATFloat) [l,r] = pure $ JsBinOp "/" l r
805+cgOp LStrHead [x] = pure $ JsArrayProj (JsInt 0) x
612−cgOp (LSDiv (ATInt ITNative)) [l,r] = pure $ JsForeign "%0/%1|0" [l, r]
613−cgOp (LSDiv (ATInt ITBig)) [l,r] =
616− pure $ JsMethod l "divide" [r]
806+cgOp LStrTail [x] = pure $ JsMethod x "slice" [JsInt 1]
617−cgOp LWriteStr [_,str] =
807+cgOp LStrCons [l,r] = pure $ JsForeign "%0+%1" [l,r]
618− do
808+cgOp LStrIndex [x, y] = pure $ JsArrayProj y x
619− s <- get
809+cgOp LStrRev [x] = pure $ JsForeign "%0.split('').reverse().join('')" [x]
620− put $ s {usedWrite = True}
810+cgOp LStrSubstr [offset,len,str] = pure $ JsForeign "%0.substr(Math.max(0,%1), Math.max(0, %2))" [str, offset, len]
621− pure $ JsForeign (writeStrTemplate $ conf s) [str]
622cgOp LReadStr [_] =
811cgOp LReadStr [_] =
625 put $ s {usedRead = True}
814 put $ s {usedRead = True}
626 pure $ JsForeign (readStrTemplate $ conf s) []
815 pure $ JsForeign (readStrTemplate $ conf s) []
627−cgOp LStrConcat [l,r] = pure $ JsBinOp "+" l r
816+cgOp LWriteStr [_,str] =
628−cgOp LStrCons [l,r] = pure $ JsForeign "%0+%1" [l,r]
629−cgOp LStrSubstr [offset,len,str] = pure $ JsForeign "%0.substr(Math.max(0,%1), Math.max(0, %2))" [str, offset, len] -- JsMethod str "substr" [offset, len]
630−cgOp (LSRem (ATInt ITNative)) [l,r] = pure $ JsBinOp "%" l r
631−cgOp (LSRem (ATInt ITBig)) [l,r] =
633− setUsedITBig
818+ s <- get
634− pure $ JsMethod l "remainder" [r]
819+ put $ s {usedWrite = True}
820+ pure $ JsForeign (writeStrTemplate $ conf s) [str]
821+cgOp LSystemInfo [x] = pure $ JsApp "js_idris_systemInfo" [x]
822+cgOp (LExternal name) _ | name == sUN "prim__null" = pure JsNull
823+cgOp (LExternal name) [l,r] | name == sUN "prim__eqPtr" = pure $ JsBinOp "==" l r
635cgOp LCrash [l] = pure $ JsErrorExp l
824cgOp LCrash [l] = pure $ JsErrorExp l
825+cgOp LNoOp [x] = pure x
636cgOp op exps = error ("Operator " ++ show (op, exps) ++ " not implemented")
826cgOp op exps = error ("Operator " ++ show (op, exps) ++ " not implemented")