on master help sign in
javascript: optimize some primitive functions
93af028raichoo
src/IRTS/CodegenJavaScript.hs+71−1
@@ -148,7 +148,77 @@ translateParameterlist =
148 where translateParameter (MN i name) = translateIdentifier name ++ show i
148 where translateParameter (MN i name) = translateIdentifier name ++ show i
149 translateParameter (UN name) = translateIdentifier name
149 translateParameter (UN name) = translateIdentifier name
150
150
151−translateDeclaration :: ([String], SDecl) -> String
151+translateDeclaration :: (String, SDecl) -> String
152+translateDeclaration (path@"__IDR__", SFun name@(UN op) _ _ _)
153+ | "prim__addBigInt" <- op =
154+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".add(" ++ op1 ++ ")"
155+ | "prim__subBigInt" <- op =
156+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".minus(" ++ op1 ++ ")"
157+ | "prim__divBigInt" <- op =
158+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".divide(" ++ op1 ++ ")"
159+ | "prim__sremBigInt" <- op =
160+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".mod(" ++ op1 ++ ")"
161+ | "prim__mulBigInt" <- op =
162+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".times(" ++ op1 ++ ")"
163+ | "prim__ltBigInt" <- op =
164+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".lesser(" ++ op1 ++ ")"
165+ | "prim__lteBigInt" <- op =
166+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".lesserOrEquals(" ++ op1 ++ ")"
167+ | "prim__gtBigInt" <- op =
168+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".greater(" ++ op1 ++ ")"
169+ | "prim__gteBigInt" <- op =
170+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".greaterOrEquals(" ++ op1 ++ ")"
171+ | "prim__eqBigInt" <- op =
172+ translateBinaryPrim $ \op0 op1 -> op0 ++ ".equals(" ++ op1 ++ ")"
173+
174+ | "prim__addInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "+" ++ op1
175+ | "prim__subInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "-" ++ op1
176+ | "prim__divInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "/" ++ op1
177+ | "prim__mulInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "*" ++ op1
178+ | "prim__ltInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<" ++ op1
179+ | "prim__lteInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<=" ++ op1
180+ | "prim__gtInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">" ++ op1
181+ | "prim__gteInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">=" ++ op1
182+ | "prim__eqInt" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "==" ++ op1
183+
184+ | "prim__addFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "+" ++ op1
185+ | "prim__subFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "-" ++ op1
186+ | "prim__divFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "/" ++ op1
187+ | "prim__mulFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "*" ++ op1
188+ | "prim__ltFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<" ++ op1
189+ | "prim__lteFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<=" ++ op1
190+ | "prim__gtFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">" ++ op1
191+ | "prim__gteFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">=" ++ op1
192+ | "prim__eqFloat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "==" ++ op1
193+
194+ | "prim__ltChar" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<" ++ op1
195+ | "prim__lteChar" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<=" ++ op1
196+ | "prim__gtChar" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">" ++ op1
197+ | "prim__gteChar" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ ">=" ++ op1
198+ | "prim__eqChar" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "==" ++ op1
199+
200+ | "prim__concat" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "+" ++ op1
201+ | "prim__ltString" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "<" ++ op1
202+ | "prim__eqString" <- op = translateBinaryPrim $ \op0 op1 -> op0 ++ "==" ++ op1
203+ | "prim__lenString" <- op = translateUnaryPrim $ \op0 -> op0 ++ ".length"
204+
205+ where translateBinaryPrim :: (String -> String -> String) -> String
206+ translateBinaryPrim op =
207+ "var " ++ path ++ translateName name
208+ ++ " = function(op0, op1){return "
209+ ++ op (primArg 0) (primArg 1)
210+ ++ ";};\n"
211+
212+ translateUnaryPrim :: (String -> String) -> String
213+ translateUnaryPrim op =
214+ "var " ++ path ++ translateName name
215+ ++ " = function(op0){return "
216+ ++ op (primArg 0)
217+ ++ ";};\n"
218+
219+ primArg :: Int -> String
220+ primArg n = idrNamespace ++ "EVAL0(op" ++ show n ++ ")"
221+
152translateDeclaration (path, SFun name params stackSize body) =
222translateDeclaration (path, SFun name params stackSize body) =
153 "var " ++ concat (path ++ [translateName name])
223 "var " ++ concat (path ++ [translateName name])
154 ++ " = function("
224 ++ " = function("