on master help sign in
javascript: quicker register access
commit3bcf23f81e319c50ae99a2c002b7084466ffba74 authorraichoo <raichoo@googlemail.com> dateMon 23 Jun 2014, 20:48 (12 years ago) parent6cb9626
2 files changed+81−103
jsrts/Runtime-common.js+23−7 src/IRTS/CodegenJavaScript.hs+58−96
jsrts/Runtime-common.js+23−7
@@ -10,6 +10,13 @@ var i$VM = function() {
1010 this.callstack = [];
1111}
1212
13+var i$vm;
14+var i$valstack;
15+var i$valstack_top;
16+var i$valstack_base;
17+var i$ret;
18+var i$callstack;
19+
1320/** @constructor */
1421var i$CON = function(tag,args,app,ev) {
1522 this.tag = tag;
@@ -18,19 +25,28 @@ var i$CON = function(tag,args,app,ev) {
1825 this.ev = ev;
1926}
2027
21−var i$SLIDE = function(vm,args) {
28+var i$SCHED = function(vm) {
29+ i$vm = vm;
30+ i$valstack = vm.valstack;
31+ i$valstack_top = vm.valstack_top;
32+ i$valstack_base = vm.valstack_base;
33+ i$ret = vm.ret;
34+ i$callstack = vm.callstack;
35+}
36+
37+var i$SLIDE = function(args) {
2238 for (var i = 0; i < args; ++i)
23− vm.valstack[vm.valstack_base + i] = vm.valstack[vm.valstack_top + i];
39+ i$valstack[i$valstack_base + i] = i$valstack[i$valstack_top + i];
2440}
2541
26−var i$PROJECT = function(vm,val,loc,arity) {
42+var i$PROJECT = function(val,loc,arity) {
2743 for (var i = 0; i < arity; ++i)
28− vm.valstack[vm.valstack_base + i + loc] = val.args[i];
44+ i$valstack[i$valstack_base + i + loc] = val.args[i];
2945}
3046
31−var i$CALL = function(vm,fun,args) {
32− vm.callstack.push(args);
33− vm.callstack.push(fun);
47+var i$CALL = function(fun,args) {
48+ i$callstack.push(args);
49+ i$callstack.push(fun);
3450}
3551
3652var __IDRRT__charCode = function(str) {
src/IRTS/CodegenJavaScript.hs+58−96
@@ -338,14 +338,13 @@ codegenJS_all target definitions includes filename outputType = do
338338 main = compileJS $
339339 JSAlloc "main" $ Just $ JSFunction [] (
340340 JSSeq [ JSAlloc "vm" (Just $ JSNew "i$VM" [])
341+ , JSApp (JSIdent "i$SCHED") [JSIdent "vm"]
341342 , JSApp (
342343 JSIdent (translateName (sMN 0 "runMain"))
343− ) [ JSIdent "vm"
344− , JSNum (JSInt 0)
345− ]
346− , JSWhile (JSProj (JSProj (JSIdent ("vm")) "callstack") "length") (
347− JSSeq [ JSAlloc "func" (Just (JSApp (JSProj (JSProj (JSIdent ("vm")) "callstack") "pop") []))
348− , JSAlloc "args" (Just (JSApp (JSProj (JSProj (JSIdent ("vm")) "callstack") "pop") []))
344+ ) [JSNum (JSInt 0)]
345+ , JSWhile (JSProj jsCALLSTACK "length") (
346+ JSSeq [ JSAlloc "func" (Just (JSApp (JSProj jsCALLSTACK "pop") []))
347+ , JSAlloc "args" (Just (JSApp (JSProj jsCALLSTACK "pop") []))
349348 , JSApp (JSProj (JSIdent "func") "apply") [JSThis, JSIdent "args"]
350349 ]
351350 )
@@ -404,17 +403,13 @@ splitFunction (JSAlloc name (Just (JSFunction args body@(JSSeq _)))) = do
404403
405404 newCall :: Int -> JS
406405 newCall depth =
407− JSApp (JSIdent "i$CALL") [ JSIdent "vm"
408− , JSIdent $ name ++ "$" ++ show depth
409− , JSArray [JSIdent "vm"
410− , JSIdent "oldbase"
411− , JSIdent "myoldbase"
412− ]
406+ JSApp (JSIdent "i$CALL") [ JSIdent $ name ++ "$" ++ show depth
407+ , JSArray [jsOLDBASE, jsMYOLDBASE]
413408 ]
414409
415410 newFun :: [JS] -> JS
416411 newFun seq =
417− JSAlloc name (Just $ JSFunction ["vm", "oldbase", "myoldbase"] (JSSeq seq))
412+ JSAlloc name (Just $ JSFunction ["oldbase", "myoldbase"] (JSSeq seq))
418413
419414splitFunction js = return js
420415
@@ -424,13 +419,10 @@ translateDecl info (name@(MN 0 fun), bc)
424419 allocCaseFunctions (snd body)
425420 ++ [ JSAlloc (
426421 translateName name
427− ) (Just $ JSFunction ["vm", "oldbase"] (
422+ ) (Just $ JSFunction ["oldbase"] (
428423 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
429424 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "app")
430− , JSApp (JSProj (translateReg $ caseReg (snd body)) "app") [ JSIdent "vm"
431− , JSIdent "oldbase"
432− , JSIdent "myoldbase"
433− ]
425+ , JSApp (JSProj (translateReg $ caseReg (snd body)) "app") [jsOLDBASE, jsMYOLDBASE]
434426 )
435427 , ( JSNoop
436428 , JSSeq $ map (translateBC info) (defaultCase (snd body))
@@ -445,13 +437,10 @@ translateDecl info (name@(MN 0 fun), bc)
445437 allocCaseFunctions (snd body)
446438 ++ [ JSAlloc (
447439 translateName name
448− ) (Just $ JSFunction ["vm", "oldbase"] (
440+ ) (Just $ JSFunction ["oldbase"] (
449441 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
450442 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "ev")
451− , JSApp (JSProj (translateReg $ caseReg (snd body)) "ev") [ JSIdent "vm"
452− , JSIdent "oldbase"
453− , JSIdent "myoldbase"
454− ]
443+ , JSApp (JSProj (translateReg $ caseReg (snd body)) "ev") [jsOLDBASE, jsMYOLDBASE]
455444 )
456445 , ( JSNoop
457446 , JSSeq $ map (translateBC info) (defaultCase (snd body))
@@ -487,7 +476,7 @@ translateDecl info (name@(MN 0 fun), bc)
487476 prepBranch (tag, code) =
488477 JSAlloc (
489478 translateName name ++ "$" ++ show tag
490− ) (Just $ JSFunction ["vm", "oldbase", "myoldbase"] (
479+ ) (Just $ JSFunction ["oldbase", "myoldbase"] (
491480 JSSeq $ map (translateBC info) code
492481 )
493482 )
@@ -495,7 +484,7 @@ translateDecl info (name@(MN 0 fun), bc)
495484translateDecl info (name, bc) =
496485 [ JSAlloc (
497486 translateName name
498− ) (Just $ JSFunction ["vm", "oldbase"] (
487+ ) (Just $ JSFunction ["oldbase"] (
499488 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info)bc
500489 )
501490 )
@@ -504,28 +493,10 @@ translateDecl info (name, bc) =
504493
505494translateReg :: Reg -> JS
506495translateReg reg
507− | RVal <- reg = JSProj (JSIdent "vm") "ret"
496+ | RVal <- reg = jsRET
508497 | Tmp <- reg = JSProj (JSIdent "vm") "reg1"
509− | L 0 <- reg =
510− JSIndex (
511− JSProj (JSIdent "vm") "valstack"
512− ) (JSProj (JSIdent "vm") "valstack_base")
513− | L n <- reg =
514− JSIndex (
515− JSProj (JSIdent "vm") "valstack"
516− ) (
517− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_base") (JSNum (JSInt n))
518− )
519− | T 0 <- reg =
520− JSIndex (
521− JSProj (JSIdent "vm") "valstack"
522− ) (JSProj (JSIdent "vm") "valstack_top")
523− | T n <- reg =
524− JSIndex (
525− JSProj (JSIdent "vm") "valstack"
526− ) (
527− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
528− )
498+ | L n <- reg = jsLOC n
499+ | T n <- reg = jsTOP n
529500
530501translateConstant :: Const -> JS
531502translateConstant (I i) = JSNum (JSInt i)
@@ -593,19 +564,13 @@ jsCALL :: CompileInfo -> Name -> JS
593564jsCALL _ n =
594565 JSApp (
595566 JSIdent "i$CALL"
596− ) [ JSIdent "vm", JSIdent (translateName n), JSArray [ JSIdent "vm"
597− , JSIdent "myoldbase"
598− ]
599− ]
567+ ) [JSIdent (translateName n), JSArray [jsMYOLDBASE]]
600568
601569jsTAILCALL :: CompileInfo -> Name -> JS
602570jsTAILCALL _ n =
603571 JSApp (
604572 JSIdent "i$CALL"
605− ) [ JSIdent "vm", JSIdent (translateName n), JSArray [ JSIdent "vm"
606− , JSIdent "oldbase"
607− ]
608− ]
573+ ) [JSIdent (translateName n), JSArray [jsOLDBASE]]
609574
610575jsFOREIGN :: CompileInfo -> Reg -> String -> [(FType, Reg)] -> JS
611576jsFOREIGN _ reg n args =
@@ -616,56 +581,25 @@ jsFOREIGN _ reg n args =
616581 )
617582
618583jsREBASE :: CompileInfo -> JS
619−jsREBASE _ =
620− JSAssign (
621− JSProj (JSIdent "vm") "valstack_base"
622− ) (
623− JSIdent "oldbase"
624− )
584+jsREBASE _ = JSAssign jsSTACKBASE jsOLDBASE
625585
626586jsSTOREOLD :: CompileInfo ->JS
627−jsSTOREOLD _ =
628− JSAssign (
629− JSIdent "myoldbase"
630− ) (
631− JSProj (JSIdent "vm") "valstack_base"
632− )
587+jsSTOREOLD _ = JSAssign jsMYOLDBASE jsSTACKBASE
633588
634589jsADDTOP :: CompileInfo -> Int -> JS
635590jsADDTOP info n
636591 | 0 <- n = JSNoop
637592 | otherwise =
638− JSBinOp "+=" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
593+ JSBinOp "+=" jsSTACKTOP (JSNum (JSInt n))
639594
640595jsTOPBASE :: CompileInfo -> Int -> JS
641−jsTOPBASE info n
642− | 0 <- n =
643− JSAssign (
644− JSProj (JSIdent "vm") "valstack_top"
645− ) (
646− JSProj (JSIdent "vm") "valstack_base"
647− )
648− | otherwise =
649− JSAssign (
650− JSProj (JSIdent "vm") "valstack_top"
651− ) (
652− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_base") (JSNum (JSInt n))
653− )
596+jsTOPBASE _ 0 = JSAssign jsSTACKTOP jsSTACKBASE
597+jsTOPBASE _ n = JSAssign jsSTACKTOP (JSBinOp "+" jsSTACKBASE (JSNum (JSInt n)))
598+
654599
655600jsBASETOP :: CompileInfo -> Int -> JS
656−jsBASETOP info n
657− | 0 <- n =
658− JSAssign (
659− JSProj (JSIdent "vm") "valstack_base"
660− ) (
661− JSProj (JSIdent "vm") "valstack_top"
662− )
663− | otherwise =
664− JSAssign (
665− JSProj (JSIdent "vm") "valstack_base"
666− ) (
667− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
668− )
601+jsBASETOP _ 0 = JSAssign jsSTACKBASE jsSTACKTOP
602+jsBASETOP _ n = JSAssign jsSTACKBASE (JSBinOp "+" jsSTACKTOP (JSNum (JSInt n)))
669603
670604jsNULL :: CompileInfo -> Reg -> JS
671605jsNULL _ r = JSAssign (translateReg r) JSNull
@@ -674,7 +608,7 @@ jsERROR :: CompileInfo -> String -> JS
674608jsERROR _ = JSError
675609
676610jsSLIDE :: CompileInfo -> Int -> JS
677−jsSLIDE _ n = JSApp (JSIdent "i$SLIDE") [JSIdent "vm", JSNum (JSInt n)]
611+jsSLIDE _ n = JSApp (JSIdent "i$SLIDE") [JSNum (JSInt n)]
678612
679613jsMKCON :: CompileInfo -> Reg -> Int -> [Reg] -> JS
680614jsMKCON info r t rs =
@@ -776,8 +710,7 @@ jsCONSTCASE info reg cases def =
776710
777711jsPROJECT :: CompileInfo -> Reg -> Int -> Int -> JS
778712jsPROJECT _ reg loc ar =
779− JSApp (JSIdent "i$PROJECT") [ JSIdent "vm"
780− , translateReg reg
713+ JSApp (JSIdent "i$PROJECT") [ translateReg reg
781714 , JSNum (JSInt loc)
782715 , JSNum (JSInt ar)
783716 ]
@@ -1392,6 +1325,35 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
13921325jsRESERVE :: CompileInfo -> Int -> JS
13931326jsRESERVE _ _ = JSNoop
13941327
1328+jsSTACK :: JS
1329+jsSTACK = JSIdent "i$valstack"
1330+
1331+jsCALLSTACK :: JS
1332+jsCALLSTACK = JSIdent "i$callstack"
1333+
1334+jsSTACKBASE :: JS
1335+jsSTACKBASE = JSIdent "i$valstack_base"
1336+
1337+jsSTACKTOP :: JS
1338+jsSTACKTOP = JSIdent "i$valstack_top"
1339+
1340+jsOLDBASE :: JS
1341+jsOLDBASE = JSIdent "oldbase"
1342+
1343+jsMYOLDBASE :: JS
1344+jsMYOLDBASE = JSIdent "myoldbase"
1345+
1346+jsRET :: JS
1347+jsRET = JSIdent "i$ret"
1348+
1349+jsLOC :: Int -> JS
1350+jsLOC 0 = JSIndex jsSTACK jsSTACKBASE
1351+jsLOC n = JSIndex jsSTACK (JSBinOp "+" jsSTACKBASE (JSNum (JSInt n)))
1352+
1353+jsTOP :: Int -> JS
1354+jsTOP 0 = JSIndex jsSTACK jsSTACKTOP
1355+jsTOP n = JSIndex jsSTACK (JSBinOp "+" jsSTACKTOP (JSNum (JSInt n)))
1356+
13951357translateBC :: CompileInfo -> BC -> JS
13961358translateBC info bc
13971359 | ASSIGN r1 r2 <- bc = jsASSIGN info r1 r2