BT /F42 8.9664 Tf 65.9552 712.0299 Td[(When)-356(a)-355(trace)-356(call)-356(returns,)-356(the)-355(monitor)-356(restores)-356(the)-355(interpreter)]TJ -11.9552 -9.9627 Td[(state.)-391(First,)-390(the)-391(monitor)-391(checks)-390(the)-391(reason)-391(for)-391(the)-390(trace)-391(e)15(xit)-391(and)]TJ 0 -9.9626 Td[(applies)-354(blacklisting)-355(if)-354(needed.)-355(Then,)-354(it)-354(pops)-355(or)-354(synthesizes)-355(inter)20(-)]TJ 0 -9.9626 Td[(preter)-273(Ja)20(v)25(aScript)-272(call)-273(stack)-273(frames)-272(as)-273(needed.)-273(Finally)65(,)-272(it)-273(copies)-273(the)]TJ 0 -9.9627 Td[(imported)-291(v)25(ariables)-292(back)-291(from)-292(the)-291(trace)-292(acti)25(v)25(ation)-291(record)-292(to)-291(the)-292(in-)]TJ 0 -9.9626 Td[(terpreter)-250(state.)]TJ 11.9552 -9.9627 Td[(At)-296(least)-295(in)-296(the)-295(current)-296(implementation,)-295(these)-296(steps)-295(ha)20(v)15(e)-296(a)-295(non-)]TJ -11.9552 -9.9626 Td[(ne)15(gligible)-328(runtime)-327(cost,)-328(so)-327(minimizing)-328(the)-328(numbe)1(r)-328(of)-328(interpreter)20(-)]TJ 0 -9.9626 Td[(to-trace)-345(and)-346(trac)1(e-to-interpreter)-346(transitions)-345(is)-345(essential)-345(for)-346(perfor)20(-)]TJ 0 -9.9627 Td[(mance.)-419(\050see)-419(also)-419(Section)-419(3.3\051.)-419(Our)-419(e)15(xperiments)-419(\050see)-419(Figure)-419(12\051)]TJ 0 -9.9626 Td[(sho)25(w)-414(that)-414(for)-415(programs)-414(we)-414(can)-414(trace)-414(well)-414(such)-415(transiti)1(ons)-415(hap-)]TJ 0 -9.9627 Td[(pen)-305(infrequently)-305(and)-305(hence)-305(do)-305(not)-305(contrib)20(ute)-305(signi\002cantly)-305(to)-305(total)]TJ 0 -9.9626 Td[(runtime.)-357(In)-357(a)-357(fe)25(w)-357(programs,)-357(where)-357(the)-358(s)1(ystem)-358(is)-357(pre)25(v)15(ented)-357(from)]TJ 0 -9.9626 Td[(recording)-338(branch)-337(traces)-338(for)-338(hot)-338(s)1(ide)-338(e)15(xits)-338(by)-338(aborts,)-337(this)-338(cost)-338(can)]TJ 0 -9.9627 Td[(rise)-250(to)-250(up)-250(to)-250(10%)-250(of)-250(total)-250(e)15(x)15(ecution)-250(time.)]TJ/F41 8.9664 Tf 0 -18.929 Td[(6.2)-1000(T)74(race)-250(Stitching)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(T)35(ransitions)-332(from)-332(a)-333(trace)-332(to)-332(a)-332(branch)-332(trace)-333(at)-332(a)-332(side)-332(e)15(xit)-332(a)20(v)20(oid)-333(the)]TJ 0 -9.9626 Td[(costs)-346(of)-347(calling)-346(traces)-347(from)-346(the)-347(monitor)40(,)-346(in)-346(a)-347(feature)-346(called)]TJ/F46 8.9664 Tf 220.8122 0 Td[(tr)15(ace)]TJ -220.8122 -9.9627 Td[(stitc)15(hing)]TJ/F42 8.9664 Tf 30.7542 0 Td[(.)-327(At)-326(a)-327(side)-327(e)15(xit,)-327(the)-326(e)15(xiting)-327(trace)-327(only)-327(needs)-326(to)-327(write)-327(li)25(v)15(e)]TJ -30.7542 -9.9626 Td[(re)15(gister)20(-carried)-226(v)25(alues)-225(back)-226(to)-226(its)-225(trace)-226(acti)25(v)25(ation)-226(record.)-225(In)-226(our)-226(im-)]TJ 0 -9.9627 Td[(plementation,)-289(identical)-290(type)-289(maps)-290(yield)-289(identical)-289(acti)25(v)25(ation)-290(record)]TJ 0 -9.9626 Td[(layouts,)-343(so)-342(the)-343(trace)-343(acti)25(v)25(ati)1(on)-343(record)-343(can)-342(be)-343(reused)-343(immediately)]TJ 0 -9.9626 Td[(by)-250(the)-250(branch)-250(trace.)]TJ 11.9552 -9.9627 Td[(In)-381(programs)-381(with)-381(branch)5(y)-381(trace)-381(trees)-381(with)-381(small)-380(traces,)-381(trace)]TJ -11.9552 -9.9626 Td[(stitching)-361(has)-362(a)-361(noticeable)-361(cost.)-361(Although)-362(writing)-361(to)-361(memory)-362(and)]TJ 0 -9.9627 Td[(then)-476(soon)-475(reading)-476(back)-475(w)10(ould)-476(be)-476(e)15(xpected)-475(to)-476(ha)20(v)15(e)-475(a)-476(high)-476(L1)]TJ 0 -9.9626 Td[(cache)-309(hit)-309(rate,)-309(for)-309(small)-309(traces)-309(the)-309(increased)-309(instruction)-309(count)-309(has)]TJ 0 -9.9626 Td[(a)-477(noticeable)-476(cost.)-477(Also,)-477(if)-476(the)-477(writes)-477(and)-477(reads)-476(are)-477(v)15(ery)-477(close)]TJ 0 -9.9627 Td[(in)-483(the)-483(dynam)1(ic)-483(instruction)-483(stream,)-483(we)-482(ha)20(v)15(e)-483(found)-483(that)-483(current)]TJ 0 -9.9626 Td[(x86)-358(processors)-358(often)-358(incur)-358(penalties)-358(of)-358(6)-358(c)15(ycles)-358(or)-358(more)-358(\050e.g.,)-358(if)]TJ 0 -9.9627 Td[(the)-326(instructions)-325(use)-326(dif)25(ferent)-326(base)-325(re)15(gisters)-326(with)-325(equal)-326(v)25(alues,)-326(the)]TJ 0 -9.9626 Td[(processor)-251(may)-250(not)-251(be)-250(able)-251(to)-250(detect)-251(that)-250(the)-251(addresses)-251(are)-250(the)-251(same)]TJ 0 -9.9626 Td[(right)-250(a)15(w)10(ay\051.)]TJ 11.9552 -9.9627 Td[(The)-309(alternate)-309(solution)-308(is)-309(to)-309(recompile)-309(an)-309(entire)-309(trace)-309(tre)1(e,)-309(thus)]TJ -11.9552 -9.9626 Td[(achie)25(ving)-350(inter)20(-trace)-351(re)15(gister)-350(allocation)-350(\05010\051.)-351(The)-350(disadv)25(antage)-351(is)]TJ 0 -9.9627 Td[(that)-210(tree)-210(recompilation)-210(tak)10(es)-209(time)-210(quadratic)-210(in)-210(the)-210(number)-210(of)-210(traces.)]TJ 0 -9.9626 Td[(W)80(e)-424(belie)25(v)15(e)-424(that)-425(the)-424(cost)-424(of)-424(recompiling)-425(a)-424(trace)-424(tree)-424(e)25(v)15(ery)-425(time)]TJ 0 -9.9626 Td[(a)-397(branch)-397(is)-397(added)-397(w)10(ould)-397(be)-397(prohibiti)25(v)15(e.)-397(That)-397(problem)-397(might)-397(be)]TJ 0 -9.9627 Td[(mitig)5(ated)-361(by)-360(recompiling)-361(only)-360(at)-361(certain)-360(points,)-361(or)-361(onl)1(y)-361(for)-361(v)15(ery)]TJ 0 -9.9626 Td[(hot,)-250(stable)-250(trees.)]TJ 11.9552 -9.9627 Td[(In)-380(the)-380(future,)-380(multicore)-380(hardw)10(are)-380(is)-380(e)15(xpected)-379(to)-380(be)-380(common,)]TJ -11.9552 -9.9626 Td[(making)-343(background)-342(tree)-343(recompilation)-342(attracti)25(v)15(e.)-343(In)-342(a)-343(closely)-343(re-)]TJ 0 -9.9626 Td[(lated)-366(project)-366(\05013\051)-365(background)-366(recompilation)-366(yielded)-366(speedups)-366(of)]TJ 0 -9.9627 Td[(up)-337(to)-338(1.25x)-337(on)-337(benchmarks)-338(with)-337(man)15(y)-337(branch)-338(traces.)-337(W)80(e)-337(plan)-338(to)]TJ 0 -9.9626 Td[(apply)-250(this)-250(technique)-250(to)-250(T)35(raceMonk)10(e)15(y)-250(as)-250(future)-250(w)10(ork.)]TJ/F41 8.9664 Tf 0 -18.929 Td[(6.3)-1000(T)74(race)-250(Recording)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(The)-209(job)-208(of)-209(the)-209(trace)-209(recorder)-208(is)-209(to)-209(emit)-209(LIR)-208(with)-209(identical)-209(semantics)]TJ 0 -9.9627 Td[(to)-294(the)-294(currently)-294(running)-293(interpreter)-294(bytecode)-294(trace.)-294(A)-294(good)-294(imple-)]TJ 0 -9.9626 Td[(mentation)-323(should)-323(ha)20(v)15(e)-323(lo)25(w)-323(impact)-323(on)-324(non-tracing)-323(interpreter)-323(per)20(-)]TJ 0 -9.9626 Td[(formance)-329(and)-329(a)-329(con)40(v)15(enient)-328(w)10(ay)-329(for)-329(implementers)-329(to)-329(maintain)-329(se-)]TJ 0 -9.9627 Td[(mantic)-250(equi)25(v)25(alence.)]TJ 11.9552 -9.9626 Td[(In)-240(our)-240(implementation,)-240(the)-240(only)-240(direct)-240(modi\002cation)-240(to)-240(the)-240(inter)20(-)]TJ -11.9552 -9.9627 Td[(preter)-233(is)-234(a)-233(call)-233(to)-234(the)-233(trace)-234(m)1(onitor)-234(at)-233(loop)-234(edges.)-233(In)-233(our)-234(benchmark)]TJ 0 -9.9626 Td[(results)-329(\050see)-329(Figure)-329(12\051)-329(the)-328(total)-329(time)-329(spent)-329(in)-329(the)-329(monitor)-329(\050for)-329(all)]TJ 0 -9.9626 Td[(acti)25(vities\051)-356(is)-355(usually)-356(less)-356(than)-355(5%,)-356(so)-356(we)-355(consider)-356(the)-356(interpreter)]TJ 0 -9.9627 Td[(impact)-339(re)1(quirement)-339(met.)-339(Increm)1(enting)-339(the)-339(loop)-338(hit)-339(counter)-338(is)-339(e)15(x-)]TJ 0 -9.9626 Td[(pensi)25(v)15(e)-215(because)-215(it)-215(requires)-215(us)-215(to)-215(look)-215(up)-215(the)-215(loop)-216(in)-215(the)-215(trace)-215(cache,)]TJ 0 -9.9627 Td[(b)20(ut)-279(we)-280(ha)20(v)15(e)-279(tuned)-280(our)-279(loops)-279(to)-280(become)-279(hot)-280(and)-279(trace)-279(v)15(ery)-280(quickly)]TJ 0 -9.9626 Td[(\050on)-263(the)-263(second)-262(iteration\051.)-263(The)-263(hit)-262(counter)-263(implementation)-263(could)-263(be)]TJ 0 -9.9626 Td[(impro)15(v)15(ed,)-310(which)-309(might)-310(gi)25(v)15(e)-310(us)-309(a)-310(small)-310(increase)-309(in)-310(o)15(v)15(erall)-310(perfor)20(-)]TJ 0 -9.9627 Td[(mance,)-310(as)-311(well)-310(as)-311(more)-310(\003e)15(xibility)-310(with)-311(tuning)-310(hotness)-311(thresholds.)]TJ 0 -9.9626 Td[(Once)-291(a)-291(loop)-290(is)-291(blacklisted)-291(we)-291(ne)25(v)15(er)-291(call)-290(into)-291(the)-291(trace)-291(monitor)-291(for)]TJ 0 -9.9627 Td[(that)-250(loop)-250(\050see)-250(Section)-250(3.3\051.)]TJ 274.9689 643.5866 Td[(Recording)-425(is)-425(acti)25(v)25(ated)-425(by)-425(a)-425(pointer)-425(sw)10(ap)-425(that)-425(sets)-425(the)-425(inter)20(-)]TJ -11.9552 -9.9627 Td[(preter')55(s)-375(dispatch)-376(ta)1(ble)-376(to)-375(call)-375(a)-376(single)-375(\223interrupt\224)-375(routine)-375(for)-376(e)25(v-)]TJ 0 -9.9626 Td[(ery)-358(bytecode.)-359(The)-358(interrupt)-358(routine)-359(\002rst)-358(calls)-358(a)-359(bytecode-speci\002c)]TJ 0 -9.9626 Td[(recording)-377(routine.)-377(Then,)-377(it)-377(turns)-377(of)25(f)-377(recording)-377(if)-377(necessary)-377(\050e.g.,)]TJ 0 -9.9627 Td[(the)-290(trace)-291(ended\051.)-290(Finally)65(,)-290(it)-290(jumps)-291(to)-290(the)-290(standard)-290(interpreter)-291(byte-)]TJ 0 -9.9626 Td[(code)-202(implementation.)-201(Some)-202(bytecodes)-201(ha)20(v)15(e)-202(ef)25(fects)-202(on)-201(the)-202(type)-202(map)]TJ 0 -9.9627 Td[(that)-310(cannot)-309(be)-310(predicted)-310(before)-310(e)15(x)15(ecuting)-309(the)-310(bytecode)-310(\050e.g.,)-310(call-)]TJ 0 -9.9626 Td[(ing)]TJ/F33 8.9664 Tf 14.1757 0 Td[(String.charCodeAt)]TJ/F42 8.9664 Tf 80.024 0 Td[(,)-303(which)-303(returns)-303(an)-303(inte)15(ger)-303(or)]TJ/F46 8.9664 Tf 106.0533 0 Td[(NaN)]TJ/F42 8.9664 Tf 19.6985 0 Td[(if)-303(the)]TJ -219.9515 -9.9626 Td[(inde)15(x)-228(ar)18(gument)-229(is)-228(out)-229(of)-228(range\051.)-229(F)15(or)-228(these,)-229(we)-228(arrange)-229(for)-228(the)-229(inter)20(-)]TJ 0 -9.9627 Td[(preter)-307(to)-307(call)-307(into)-307(the)-307(recorder)-307(ag)5(ain)-307(after)-308(e)15(x)15(ecuting)-307(the)-307(bytecode.)]TJ 0 -9.9626 Td[(Since)-302(such)-302(hooks)-301(are)-302(relati)25(v)15(ely)-302(rare,)-302(we)-301(embed)-302(them)-302(directly)-302(into)]TJ 0 -9.9627 Td[(the)-318(interpreter)40(,)-319(with)-318(an)-319(additional)-318(runtime)-319(check)-318(to)-319(see)-318(whether)-319(a)]TJ 0 -9.9626 Td[(recorder)-250(is)-250(currently)-250(acti)25(v)15(e.)]TJ 11.9552 -9.9626 Td[(While)-244(separating)-244(the)-244(interpreter)-244(from)-244(the)-244(recorder)-244(reduces)-244(indi-)]TJ -11.9552 -9.9627 Td[(vidual)-215(code)-216(comple)15(xity)65(,)-215(it)-215(also)-216(requires)-215(careful)-215(implementation)-216(and)]TJ 0 -9.9626 Td[(e)15(xtensi)25(v)15(e)-250(testing)-250(to)-250(achie)25(v)15(e)-250(semantic)-250(equi)25(v)25(alence.)]TJ 11.9552 -9.9627 Td[(In)-302(some)-301(cases)-302(achie)25(ving)-301(this)-302(equi)25(v)25(alence)-302(is)-301(dif)25(\002cult)-302(since)-301(Spi-)]TJ -11.9552 -9.9626 Td[(derMonk)10(e)15(y)-313(follo)25(ws)-312(a)]TJ/F46 8.9664 Tf 80.1794 0 Td[(fat-bytecode)]TJ/F42 8.9664 Tf 47.1246 0 Td[(design,)-313(which)-312(w)10(as)-313(found)-313(to)-313(be)]TJ -127.304 -9.9626 Td[(bene\002cial)-250(to)-250(pure)-250(interpreter)-250(performance.)]TJ 11.9552 -9.9627 Td[(In)-428(f)10(at-bytecode)-427(designs,)-428(indi)25(vidual)-428(bytecodes)-428(can)-427(implement)]TJ -11.9552 -9.9626 Td[(comple)15(x)-446(processing)-446(\050e.g.,)-446(the)]TJ/F33 8.9664 Tf 114.2213 0 Td[(getprop)]TJ/F42 8.9664 Tf 36.9499 0 Td[(bytecode,)-446(which)-446(imple-)]TJ -151.1712 -9.9627 Td[(ments)-221(full)-221(Ja)20(v)25(aScript)-222(property)-221(v)25(alue)-221(access,)-221(including)-222(s)1(pecial)-222(cases)]TJ 0 -9.9626 Td[(for)-250(cached)-250(and)-250(dense)-250(array)-250(access\051.)]TJ 11.9552 -9.9626 Td[(F)15(at)-461(bytecodes)-461(ha)20(v)15(e)-461(tw)10(o)-461(adv)25(antages:)-461(fe)25(wer)-461(bytecodes)-461(means)]TJ -11.9552 -9.9627 Td[(lo)25(wer)-255(dispatch)-255(cost,)-255(and)-255(bigger)-255(bytecode)-256(impleme)1(ntations)-256(gi)25(v)15(e)-255(the)]TJ 0 -9.9626 Td[(compiler)-250(more)-250(opportunities)-250(to)-250(optimize)-250(the)-250(interpreter)55(.)]TJ 11.9552 -9.9627 Td[(F)15(at)-436(bytecodes)-436(are)-435(a)-436(problem)-436(for)-436(T)35(raceMonk)10(e)15(y)-436(because)-435(the)15(y)]TJ -11.9552 -9.9626 Td[(require)-408(the)-408(recorder)-409(to)-408(reimplement)-408(the)-408(same)-408(special)-409(c)1(ase)-409(logic)]TJ 0 -9.9626 Td[(in)-433(the)-433(same)-433(w)10(ay)65(.)-433(Also,)-433(the)-433(adv)25(antages)-433(are)-434(reduced)-433(because)-433(\050a\051)]TJ 0 -9.9627 Td[(dispatch)-374(costs)-374(are)-374(eliminated)-374(entirely)-374(in)-374(compiled)-374(traces,)-374(\050b\051)-374(the)]TJ 0 -9.9626 Td[(traces)-456(contain)-457(only)-456(one)-457(special)-456(case,)-456(not)-457(the)-456(interpreter')55(s)-457(lar)18(ge)]TJ 0 -9.9627 Td[(chunk)-282(of)-281(code,)-282(and)-281(\050c\051)-282(T)35(raceMonk)10(e)15(y)-281(spends)-282(less)-282(time)-281(running)-282(the)]TJ 0 -9.9626 Td[(base)-250(interpreter)55(.)]TJ 11.9552 -9.9626 Td[(One)-247(w)10(ay)-246(we)-247(ha)20(v)15(e)-246(mitig)5(ated)-247(these)-247(problems)-246(is)-247(by)-246(implementing)]TJ -11.9552 -9.9627 Td[(certain)-311(comple)15(x)-311(bytecodes)-311(in)-311(the)-311(recorder)-311(as)-312(sequences)-311(of)-311(simple)]TJ 0 -9.9626 Td[(bytecodes.)-193(Expressing)-193(the)-193(original)-192(semantics)-193(this)-193(w)10(ay)-193(is)-193(not)-193(too)-193(dif-)]TJ 0 -9.9627 Td[(\002cult,)-247(and)-248(recording)-247(simple)-247(bytecodes)-247(is)-248(much)-247(easier)55(.)-247(This)-248(enables)]TJ 0 -9.9626 Td[(us)-235(to)-234(retain)-235(the)-234(adv)25(antages)-235(of)-234(f)10(at)-235(bytecodes)-234(while)-235(a)20(v)20(oiding)-234(some)-235(of)]TJ 0 -9.9626 Td[(their)-252(problems)-252(for)-252(trace)-251(recording.)-252(This)-252(is)-252(particularly)-252(ef)25(fecti)25(v)15(e)-252(for)]TJ 0 -9.9627 Td[(f)10(at)-288(bytecodes)-288(that)-287(recurse)-288(back)-288(into)-288(the)-287(interpreter)40(,)-288(for)-288(e)15(xample)-288(to)]TJ 0 -9.9626 Td[(con)40(v)15(ert)-287(an)-288(object)-287(into)-288(a)-287(primiti)25(v)15(e)-288(v)25(alue)-287(by)-288(in)40(v)20(oking)-287(a)-288(well-kno)25(wn)]TJ 0 -9.9627 Td[(method)-250(on)-250(the)-250(object,)-250(since)-250(it)-250(lets)-250(us)-250(inline)-250(this)-250(function)-250(call.)]TJ 11.9552 -9.9626 Td[(It)-269(is)-270(important)-269(to)-270(note)-269(that)-270(we)-269(split)-270(f)10(at)-269(opcodes)-269(into)-270(thinner)-269(op-)]TJ -11.9552 -9.9626 Td[(codes)-256(only)-257(during)-256(recording.)-257(When)-256(running)-256(purely)-257(interpretati)25(v)15(ely)]TJ 0 -9.9627 Td[(\050i.e.)-259(code)-259(that)-259(has)-259(been)-259(blacklisted\051,)-259(the)-259(interpreter)-260(direct)1(ly)-260(and)-259(ef-)]TJ 0 -9.9626 Td[(\002ciently)-250(e)15(x)15(ecutes)-250(the)-250(f)10(at)-250(opcodes.)]TJ/F41 8.9664 Tf 0 -31.8805 Td[(6.4)-1000(Pr)18(eemption)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(SpiderMonk)10(e)15(y)65(,)-223(lik)10(e)-223(man)15(y)-223(VMs,)-223(needs)-223(to)-223(preempt)-224(the)-223(user)-223(program)]TJ 0 -9.9626 Td[(periodically)65(.)-441(The)-440(main)-441(reasons)-440(are)-441(to)-441(pre)25(v)15(ent)-440(in\002nitely)-441(looping)]TJ 0 -9.9626 Td[(scripts)-250(from)-250(locking)-250(up)-250(the)-250(host)-250(system)-250(and)-250(to)-250(schedule)-250(GC.)]TJ 11.9552 -9.9627 Td[(In)-274(the)-274(interpreter)40(,)-274(this)-274(had)-274(been)-274(implemented)-274(by)-273(setting)-274(a)-274(\223pre-)]TJ -11.9552 -9.9626 Td[(empt)-357(no)25(w\224)-358(\003ag)-357(that)-357(w)10(as)-357(check)10(ed)-358(on)-357(e)25(v)15(ery)-357(backw)10(ard)-357(jump.)-358(This)]TJ 0 -9.9627 Td[(strate)15(gy)-244(carried)-245(o)15(v)15(er)-244(into)-245(T)35(raceMonk)10(e)15(y:)-244(the)-245(VM)-244(inserts)-245(a)-244(guard)-245(on)]TJ 0 -9.9626 Td[(the)-342(preemption)-342(\003ag)-343(at)-342(e)25(v)15(ery)-342(loop)-342(edge.)-343(W)80(e)-342(measured)-342(less)-342(than)-343(a)]TJ 0 -9.9626 Td[(1%)-327(increase)-327(in)-327(runtime)-327(on)-327(most)-327(benchmarks)-327(for)-327(this)-327(e)15(xtra)-327(guard.)]TJ 0 -9.9627 Td[(In)-237(practice,)-236(the)-237(cost)-237(is)-236(detectable)-237(only)-237(for)-237(programs)-236(with)-237(v)15(ery)-237(short)]TJ 0 -9.9626 Td[(loops.)]TJ 11.9552 -9.9627 Td[(W)80(e)-390(tested)-390(and)-391(rejected)-390(a)-390(solution)-390(that)-391(a)20(v)20(oided)-390(the)-390(guards)-390(by)]TJ -11.9552 -9.9626 Td[(compiling)-361(the)-362(loop)-361(edge)-361(as)-362(a)1(n)-362(unconditional)-361(jump,)-361(and)-362(patching)]TJ 0 -9.9626 Td[(the)-412(jump)-412(tar)18(get)-412(to)-412(an)-412(e)15(xit)-412(routine)-412(when)-412(preemption)-412(is)-412(required.)]TJ 0 -9.9627 Td[(This)-394(solution)-395(can)-394(mak)10(e)-394(the)-395(normal)-394(case)-395(slightly)-394(f)10(aster)40(,)-394(b)20(ut)-395(then)]TJ 0 -9.9626 Td[(preemption)-256(becomes)-257(v)15(ery)-256(slo)25(w)65(.)-256(The)-257(implementation)-256(w)10(as)-256(also)-257(v)15(ery)]TJ 0 -9.9627 Td[(comple)15(x,)-201(especially)-200(trying)-201(to)-201(restart)-201(e)15(x)15(ecution)-200(after)-201(the)-201(preemption.)]TJ ET