@@ -695,15 +695,15 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
695695 | (LSRem (ATInt ITBig)) <- op
696696 , (lhs:rhs:_) <- args = invokeMeth lhs "mod" [rhs]
697697 | (LEq (ATInt ITBig)) <- op
698− , (lhs:rhs:_) <- args = invokeMeth lhs "equals" [rhs]
698+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "equals" [rhs]
699699 | (LSLt (ATInt ITBig)) <- op
700− , (lhs:rhs:_) <- args = invokeMeth lhs "lesser" [rhs]
700+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesser" [rhs]
701701 | (LSLe (ATInt ITBig)) <- op
702− , (lhs:rhs:_) <- args = invokeMeth lhs "lesserOrEquals" [rhs]
702+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesserOrEquals" [rhs]
703703 | (LSGt (ATInt ITBig)) <- op
704− , (lhs:rhs:_) <- args = invokeMeth lhs "greater" [rhs]
704+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greater" [rhs]
705705 | (LSGe (ATInt ITBig)) <- op
706− , (lhs:rhs:_) <- args = invokeMeth lhs "greaterOrEquals" [rhs]
706+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greaterOrEquals" [rhs]
707707
708708 | (LPlus ATFloat) <- op
709709 , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs
@@ -714,15 +714,15 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
714714 | (LSDiv ATFloat) <- op
715715 , (lhs:rhs:_) <- args = translateBinaryOp "/" lhs rhs
716716 | (LEq ATFloat) <- op
717− , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs
717+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs
718718 | (LSLt ATFloat) <- op
719− , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs
719+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs
720720 | (LSLe ATFloat) <- op
721− , (lhs:rhs:_) <- args = translateBinaryOp "<=" lhs rhs
721+ , (lhs:rhs:_) <- args = translateCompareOp "<=" lhs rhs
722722 | (LSGt ATFloat) <- op
723− , (lhs:rhs:_) <- args = translateBinaryOp ">" lhs rhs
723+ , (lhs:rhs:_) <- args = translateCompareOp ">" lhs rhs
724724 | (LSGe ATFloat) <- op
725− , (lhs:rhs:_) <- args = translateBinaryOp ">=" lhs rhs
725+ , (lhs:rhs:_) <- args = translateCompareOp ">=" lhs rhs
726726
727727 | (LPlus (ATInt ITChar)) <- op
728728 , (lhs:rhs:_) <- args =
@@ -761,44 +761,26 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
761761 ]
762762
763763 | (LLSHR (ITFixed IT8)) <- op
764− , (lhs:rhs:_) <- args =
765− jsPackUBits8 (
766− JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
767− )
764+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp ">>" lhs rhs
768765
769766 | (LLSHR (ITFixed IT16)) <- op
770− , (lhs:rhs:_) <- args =
771− jsPackUBits16 (
772− JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
773− )
767+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp ">>" lhs rhs
774768
775769 | (LLSHR (ITFixed IT32)) <- op
776− , (lhs:rhs:_) <- args =
777− jsPackUBits32 (
778− JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
779− )
770+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp ">>" lhs rhs
780771
781772 | (LLSHR (ITFixed IT64)) <- op
782773 , (lhs:rhs:_) <- args =
783774 jsMeth (translateReg lhs) "shiftRight" [translateReg rhs]
784775
785776 | (LSHL (ITFixed IT8)) <- op
786− , (lhs:rhs:_) <- args =
787− jsPackUBits8 (
788− JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
789− )
777+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "<<" lhs rhs
790778
791779 | (LSHL (ITFixed IT16)) <- op
792− , (lhs:rhs:_) <- args =
793− jsPackUBits16 (
794− JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
795− )
780+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "<<" lhs rhs
796781
797782 | (LSHL (ITFixed IT32)) <- op
798− , (lhs:rhs:_) <- args =
799− jsPackUBits32 (
800− JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)
801− )
783+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "<<" lhs rhs
802784
803785 | (LSHL (ITFixed IT64)) <- op
804786 , (lhs:rhs:_) <- args =
@@ -807,88 +789,52 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
807789 ]
808790
809791 | (LAnd (ITFixed IT8)) <- op
810− , (lhs:rhs:_) <- args =
811− jsPackUBits8 (
812− JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
813− )
792+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "&" lhs rhs
814793
815794 | (LAnd (ITFixed IT16)) <- op
816− , (lhs:rhs:_) <- args =
817− jsPackUBits16 (
818− JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
819− )
795+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "&" lhs rhs
820796
821797 | (LAnd (ITFixed IT32)) <- op
822− , (lhs:rhs:_) <- args =
823− jsPackUBits32 (
824− JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
825− )
798+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "&" lhs rhs
826799
827800 | (LAnd (ITFixed IT64)) <- op
828801 , (lhs:rhs:_) <- args =
829802 jsMeth (translateReg lhs) "and" [translateReg rhs]
830803
831804 | (LOr (ITFixed IT8)) <- op
832− , (lhs:rhs:_) <- args =
833− jsPackUBits8 (
834− JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
835− )
805+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "|" lhs rhs
836806
837807 | (LOr (ITFixed IT16)) <- op
838− , (lhs:rhs:_) <- args =
839− jsPackUBits16 (
840− JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
841− )
808+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "|" lhs rhs
842809
843810 | (LOr (ITFixed IT32)) <- op
844− , (lhs:rhs:_) <- args =
845− jsPackUBits32 (
846− JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
847− )
811+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "|" lhs rhs
848812
849813 | (LOr (ITFixed IT64)) <- op
850814 , (lhs:rhs:_) <- args =
851815 jsMeth (translateReg lhs) "or" [translateReg rhs]
852816
853817 | (LXOr (ITFixed IT8)) <- op
854− , (lhs:rhs:_) <- args =
855− jsPackUBits8 (
856− JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
857− )
818+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "^" lhs rhs
858819
859820 | (LXOr (ITFixed IT16)) <- op
860− , (lhs:rhs:_) <- args =
861− jsPackUBits16 (
862− JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
863− )
821+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "^" lhs rhs
864822
865823 | (LXOr (ITFixed IT32)) <- op
866− , (lhs:rhs:_) <- args =
867− jsPackUBits32 (
868− JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
869− )
824+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "^" lhs rhs
870825
871826 | (LXOr (ITFixed IT64)) <- op
872827 , (lhs:rhs:_) <- args =
873828 jsMeth (translateReg lhs) "xor" [translateReg rhs]
874829
875830 | (LPlus (ATInt (ITFixed IT8))) <- op
876− , (lhs:rhs:_) <- args =
877− jsPackUBits8 (
878− JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
879− )
831+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "+" lhs rhs
880832
881833 | (LPlus (ATInt (ITFixed IT16))) <- op
882− , (lhs:rhs:_) <- args =
883− jsPackUBits16 (
884− JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
885− )
834+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "+" lhs rhs
886835
887836 | (LPlus (ATInt (ITFixed IT32))) <- op
888− , (lhs:rhs:_) <- args =
889− jsPackUBits32 (
890− JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
891− )
837+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "+" lhs rhs
892838
893839 | (LPlus (ATInt (ITFixed IT64))) <- op
894840 , (lhs:rhs:_) <- args =
@@ -897,22 +843,13 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
897843 ]
898844
899845 | (LMinus (ATInt (ITFixed IT8))) <- op
900− , (lhs:rhs:_) <- args =
901− jsPackUBits8 (
902− JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
903− )
846+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "-" lhs rhs
904847
905848 | (LMinus (ATInt (ITFixed IT16))) <- op
906− , (lhs:rhs:_) <- args =
907− jsPackUBits16 (
908− JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
909− )
849+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "-" lhs rhs
910850
911851 | (LMinus (ATInt (ITFixed IT32))) <- op
912− , (lhs:rhs:_) <- args =
913− jsPackUBits32 (
914− JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
915− )
852+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "-" lhs rhs
916853
917854 | (LMinus (ATInt (ITFixed IT64))) <- op
918855 , (lhs:rhs:_) <- args =
@@ -921,22 +858,13 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
921858 ]
922859
923860 | (LTimes (ATInt (ITFixed IT8))) <- op
924− , (lhs:rhs:_) <- args =
925− jsPackUBits8 (
926− JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
927− )
861+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "*" lhs rhs
928862
929863 | (LTimes (ATInt (ITFixed IT16))) <- op
930− , (lhs:rhs:_) <- args =
931− jsPackUBits16 (
932− JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
933− )
864+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "*" lhs rhs
934865
935866 | (LTimes (ATInt (ITFixed IT32))) <- op
936− , (lhs:rhs:_) <- args =
937− jsPackUBits32 (
938− JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
939− )
867+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "*" lhs rhs
940868
941869 | (LTimes (ATInt (ITFixed IT64))) <- op
942870 , (lhs:rhs:_) <- args =
@@ -945,110 +873,62 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
945873 ]
946874
947875 | (LEq (ATInt (ITFixed IT8))) <- op
948− , (lhs:rhs:_) <- args =
949− jsPackUBits8 (
950− JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
951− )
876+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs
952877
953878 | (LEq (ATInt (ITFixed IT16))) <- op
954− , (lhs:rhs:_) <- args =
955− jsPackUBits16 (
956− JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
957− )
879+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs
958880
959881 | (LEq (ATInt (ITFixed IT32))) <- op
960− , (lhs:rhs:_) <- args =
961− jsPackUBits32 (
962− JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
963− )
882+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs
964883
965884 | (LEq (ATInt (ITFixed IT64))) <- op
966− , (lhs:rhs:_) <- args =
967− jsMeth (jsMeth (translateReg lhs) "equals" [translateReg rhs]) "and" [
968− jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)
969− ]
885+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "equals" [rhs]
970886
971887 | (LLt (ITFixed IT8)) <- op
972− , (lhs:rhs:_) <- args =
973− jsPackUBits8 (
974− JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
975− )
888+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs
976889
977890 | (LLt (ITFixed IT16)) <- op
978− , (lhs:rhs:_) <- args =
979− jsPackUBits16 (
980− JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
981− )
891+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs
982892
983893 | (LLt (ITFixed IT32)) <- op
984− , (lhs:rhs:_) <- args =
985− jsPackUBits32 (
986− JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
987− )
894+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs
988895
989896 | (LLt (ITFixed IT64)) <- op
990− , (lhs:rhs:_) <- args = invokeMeth lhs "lesser" [rhs]
897+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesser" [rhs]
991898
992899 | (LLe (ITFixed IT8)) <- op
993− , (lhs:rhs:_) <- args =
994− jsPackUBits8 (
995− JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
996− )
900+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs
997901
998902 | (LLe (ITFixed IT16)) <- op
999− , (lhs:rhs:_) <- args =
1000− jsPackUBits16 (
1001− JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1002− )
903+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs
1003904
1004905 | (LLe (ITFixed IT32)) <- op
1005− , (lhs:rhs:_) <- args =
1006− jsPackUBits32 (
1007− JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1008− )
906+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs
1009907
1010908 | (LLe (ITFixed IT64)) <- op
1011− , (lhs:rhs:_) <- args = invokeMeth lhs "lesserOrEquals" [rhs]
909+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesserOrEquals" [rhs]
1012910
1013911 | (LGt (ITFixed IT8)) <- op
1014− , (lhs:rhs:_) <- args =
1015− jsPackUBits8 (
1016− JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1017− )
912+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs
1018913
1019914 | (LGt (ITFixed IT16)) <- op
1020− , (lhs:rhs:_) <- args =
1021− jsPackUBits16 (
1022− JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1023− )
915+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs
1024916 | (LGt (ITFixed IT32)) <- op
1025− , (lhs:rhs:_) <- args =
1026− jsPackUBits32 (
1027− JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1028− )
917+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs
1029918
1030919 | (LGt (ITFixed IT64)) <- op
1031− , (lhs:rhs:_) <- args = invokeMeth lhs "greater" [rhs]
920+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greater" [rhs]
1032921
1033922 | (LGe (ITFixed IT8)) <- op
1034− , (lhs:rhs:_) <- args =
1035− jsPackUBits8 (
1036− JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1037− )
923+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs
1038924
1039925 | (LGe (ITFixed IT16)) <- op
1040− , (lhs:rhs:_) <- args =
1041− jsPackUBits16 (
1042− JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1043− )
926+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs
1044927 | (LGe (ITFixed IT32)) <- op
1045− , (lhs:rhs:_) <- args =
1046− jsPackUBits32 (
1047− JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1048− )
928+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs
1049929
1050930 | (LGe (ITFixed IT64)) <- op
1051− , (lhs:rhs:_) <- args = invokeMeth lhs "greaterOrEquals" [rhs]
931+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greaterOrEquals" [rhs]
1052932
1053933 | (LUDiv (ITFixed IT8)) <- op
1054934 , (lhs:rhs:_) <- args =
@@ -1150,8 +1030,7 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
11501030 jsPackSBits32 $ JSPreOp "~" $ jsUnPackBits (translateReg arg)
11511031
11521032 | (LCompl (ITFixed IT64)) <- op
1153− , (arg:_) <- args =
1154− invokeMeth arg "not" []
1033+ , (arg:_) <- args = invokeMeth arg "not" []
11551034
11561035 | (LPlus _) <- op
11571036 , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs
@@ -1164,15 +1043,15 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
11641043 | (LSRem _) <- op
11651044 , (lhs:rhs:_) <- args = translateBinaryOp "%" lhs rhs
11661045 | (LEq _) <- op
1167− , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs
1046+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs
11681047 | (LSLt _) <- op
1169− , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs
1048+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs
11701049 | (LSLe _) <- op
1171− , (lhs:rhs:_) <- args = translateBinaryOp "<=" lhs rhs
1050+ , (lhs:rhs:_) <- args = translateCompareOp "<=" lhs rhs
11721051 | (LSGt _) <- op
1173− , (lhs:rhs:_) <- args = translateBinaryOp ">" lhs rhs
1052+ , (lhs:rhs:_) <- args = translateCompareOp ">" lhs rhs
11741053 | (LSGe _) <- op
1175− , (lhs:rhs:_) <- args = translateBinaryOp ">=" lhs rhs
1054+ , (lhs:rhs:_) <- args = translateCompareOp ">=" lhs rhs
11761055 | (LAnd _) <- op
11771056 , (lhs:rhs:_) <- args = translateBinaryOp "&" lhs rhs
11781057 | (LOr _) <- op
@@ -1189,9 +1068,9 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
11891068 | LStrConcat <- op
11901069 , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs
11911070 | LStrEq <- op
1192− , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs
1071+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs
11931072 | LStrLt <- op
1194− , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs
1073+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs
11951074 | LStrLen <- op
11961075 , (arg:_) <- args = JSProj (translateReg arg) "length"
11971076 | (LStrInt ITNative) <- op
@@ -1269,13 +1148,25 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
12691148 , _ <- args = JSNull
12701149 | LExternal ex <- op
12711150 , ex == sUN "prim__eqPtr"
1272− , [lhs, rhs] <- args = JSBinOp "==" (translateReg lhs) (translateReg rhs)
1151+ , [lhs, rhs] <- args = translateCompareOp "==" lhs rhs
12731152 | otherwise = JSError $ "Not implemented: " ++ show op
12741153 where
12751154 translateBinaryOp :: String -> Reg -> Reg -> JS
12761155 translateBinaryOp op lhs rhs =
12771156 JSBinOp op (translateReg lhs) (translateReg rhs)
12781157
1158+ translateCompareOp :: String -> Reg -> Reg -> JS
1159+ translateCompareOp op lhs rhs =
1160+ JSPreOp "+" $ translateBinaryOp op lhs rhs
1161+
1162+ bitsBinaryOp :: String -> Reg -> Reg -> JS
1163+ bitsBinaryOp op lhs rhs =
1164+ JSBinOp op (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))
1165+
1166+ bitsCompareOp :: String -> Reg -> Reg -> JS
1167+ bitsCompareOp op lhs rhs =
1168+ JSPreOp "+" $ bitsBinaryOp op lhs rhs
1169+
12791170 invokeMeth :: Reg -> String -> [Reg] -> JS
12801171 invokeMeth obj meth args =
12811172 JSApp (JSProj (translateReg obj) meth) $ map translateReg args