X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2FresJIT.ml;fp=src%2FresJIT.ml;h=e7189f573d636cf71658f28cad24bab9f0a17b30;hb=ff99aa3de1810d5607f31f1f7597da78af72b6bf;hp=c3daf11b13ca7b14c3fef08ffc97f9776bfc76da;hpb=e5684525c6814acc412b582b346d5ee6cb5b6597;p=SXSI%2Fxpathcomp.git diff --git a/src/resJIT.ml b/src/resJIT.ml index c3daf11..e7189f5 100644 --- a/src/resJIT.ml +++ b/src/resJIT.ml @@ -346,8 +346,8 @@ DEFINE EXEC_INSTR_TEMPLATE(ns) = fun slot1 slot2 t inst acc -> | RIGHT src -> ns.concat acc slot2.(src) -DEFINE EXEC_CODE_TEMPLATE(ns) = fun slot slot1 slot2 t dst code -> - match code with +DEFINE EXEC_CODE_BODY_TEMPLATE(ns) = + (match code with | OP_NOP _ -> () | OP_LEFT1 src -> @@ -398,16 +398,19 @@ DEFINE EXEC_CODE_TEMPLATE(ns) = fun slot slot1 slot2 t dst code -> | OP_SELF_LEFT2_RIGHT2 (src1, src2, src3, src4) -> slot.(dst) <- ns.conscat4 t slot1.(src1) slot1.(src2) slot2.(src3) slot2.(src4) - | OP_OTHER line -> + | OP_OTHER line -> assert false (* let acc = ref ns.empty in let len = Array.length line - 1 in for j = 0 to len do acc := exec_instr slot1 slot2 t line.(j) !acc done; - slot.(dst) <- !acc + slot.(dst) <- !acc *) ) + +DEFINE EXEC_CODE_TEMPLATE(ns) = fun slot slot1 slot2 t dst code -> + EXEC_CODE_BODY_TEMPLATE(ns) -DEFINE EXEC_REC_TEMPLATE = +DEFINE EXEC_REC_TEMPLATE(exec_code) = (match code with | Nil -> () | Cons(dst, opcode, code1) -> @@ -426,6 +429,26 @@ DEFINE EXEC_REC_TEMPLATE = exec slot slot1 slot2 t code1 end) +let count_exec_code slot slot1 slot2 t dst code = + EXEC_CODE_BODY_TEMPLATE(NodeSet.Count) + + +let count_exec slot slot1 slot2 t code = + let rec exec slot slot1 slot2 t code = + EXEC_REC_TEMPLATE(count_exec_code) + in + exec slot slot1 slot2 t code + +let mat_exec_code slot slot1 slot2 t dst code = + EXEC_CODE_BODY_TEMPLATE(NodeSet.Mat) + + +let mat_exec slot slot1 slot2 t code = + let rec exec slot slot1 slot2 t code = + EXEC_REC_TEMPLATE(mat_exec_code) + in + exec slot slot1 slot2 t code + DEFINE EXEC_TEMPLATE = (TRACE("res-jit", 3, __ "Node %i:\n" (Node.to_int t)); @@ -445,6 +468,16 @@ DEFINE UPDATE_TEMPLATE = f empty_res sl1 sl2 tree node +let update exec cache auto tlist s1 s2 empty_res sl1 sl2 tree node = + let f = find cache tlist s1 s2 in + if f == dummy_update then + let f = gen_code exec auto tlist s1 s2 in + add cache tlist s1 s2 f; + f empty_res sl1 sl2 tree node + else + f empty_res sl1 sl2 tree node + + module type S = sig module NS : NodeSet.S @@ -465,7 +498,7 @@ module Count = let print fmt s = PRINT_TEMPLATE(NS) let exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Count) let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Count) - let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE + let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE(exec_code) let exec slot slot1 slot2 t code = EXEC_TEMPLATE let update cache auto tlist s1 s2 empty_res sl1 sl2 tree node = UPDATE_TEMPLATE let var _ x = x @@ -480,7 +513,7 @@ module Mat = let print fmt s = PRINT_TEMPLATE(NS) let exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Mat) let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Mat) - let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE + let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE(exec_code) let exec slot slot1 slot2 t code = EXEC_TEMPLATE let update cache auto tlist s1 s2 empty_res sl1 sl2 tree node = UPDATE_TEMPLATE let var _ x = x @@ -497,7 +530,7 @@ module Make(U : NodeSet.S) = let print fmt s = PRINT_TEMPLATE(NS) let exec_instr = EXEC_INSTR_TEMPLATE(U) let exec_code = EXEC_CODE_TEMPLATE(U) - let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE + let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE(exec_code) let exec slot slot1 slot2 t code = EXEC_TEMPLATE let update cache auto tlist s1 s2 empty_res sl1 sl2 tree node = UPDATE_TEMPLATE let var i t =