DEFINE SET(a, b) = (a) <- (b)
+DEFINE PRINT_TEMPLATE(ns) =
+ let pr fmt (state, count) =
+ fprintf fmt "%a: %i" State.print state (ns.length count)
+ in
+ Pretty.print_array ~sep:", " pr fmt (Array.mapi (fun x y -> (x,y)) s)
+
DEFINE EXEC_INSTR_TEMPLATE(ns) = fun slot1 slot2 t inst acc ->
match inst with
| SELF _ -> ns.snoc acc t
slot.(dst) <- !acc
+DEFINE EXEC_REC_TEMPLATE =
+ (match code with
+ | Nil -> ()
+ | Cons(dst, opcode, code1) ->
+ TRACE("res-jit", 3, __ " %a := %a\n%!"
+ State.print dst print_opcode opcode;
+ );
+ exec_code slot slot1 slot2 t dst opcode;
+ begin
+ match code1 with
+ | Nil -> ()
+ | Cons(dst, opcode, code1) ->
+ TRACE("res-jit", 3, __ " %a := %a\n%!"
+ State.print dst print_opcode opcode;
+ );
+ exec_code slot slot1 slot2 t dst opcode;
+ exec slot slot1 slot2 t code1
+
+ end)
+
+DEFINE EXEC_TEMPLATE =
+ (TRACE("res-jit", 3, __ "Node %i:\n" (Node.to_int t));
+ TRACE("res-jit", 3, __ " LEFT : %a\n" pr_slot slot1);
+ TRACE("res-jit", 3, __ " RIGHT : %a\n" pr_slot slot2);
+ exec slot slot1 slot2 t code;
+ TRACE("res-jit", 3, __ " RES : %a\n\n%!" pr_slot slot))
+
+
module type S =
sig
module NS : NodeSet.S
val is_open : t -> bool
end
-
-
module Count =
struct
module NS = NodeSet.Count
type t = NodeSet.Count.t array
- let print fmt s =
- let pr fmt (state, count) =
- fprintf fmt "%a: %i" State.print state (NS.length count)
- in
- Pretty.print_array ~sep:", " pr fmt (Array.mapi (fun x y -> (x,y)) s)
-
+ let print fmt s = PRINT_TEMPLATE(NS)
let exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Count)
let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Count)
- (* inline by hand for efficiency reason *)
- let rec exec slot slot1 slot2 t code =
- match code with
- | Nil -> ()
- | Cons(dst, opcode, code1) ->
- TRACE("res-jit", 3, __ " %a := %a\n%!"
- State.print dst print_opcode opcode;
- );
- exec_code slot slot1 slot2 t dst opcode;
- begin
- match code1 with
- | Nil -> ()
- | Cons(dst, opcode, code1) ->
- TRACE("res-jit", 3, __ " %a := %a\n%!"
- State.print dst print_opcode opcode;
- );
- exec_code slot slot1 slot2 t dst opcode;
- exec slot slot1 slot2 t code1
- end
-
- let exec slot slot1 slot2 t code =
- TRACE("res-jit", 3, __ "Node %i:\n" (Node.to_int t));
- TRACE("res-jit", 3, __ " LEFT : %a\n" pr_slot slot1);
- TRACE("res-jit", 3, __ " RIGHT : %a\n" pr_slot slot2);
- exec slot slot1 slot2 t code;
- TRACE("res-jit", 3, __ " RES : %a\n\n%!" pr_slot slot)
-
-
+ let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE
+ let exec slot slot1 slot2 t code = EXEC_TEMPLATE
let var _ x = x
let close _ x = x
-
let is_open _ = false
end
struct
module NS = NodeSet.Mat
type t = NodeSet.Mat.t array
- let print fmt s =
- let pr fmt (state, count) =
- fprintf fmt "%a: %i" State.print state (NS.length count)
- in
- Pretty.print_array ~sep:", " pr fmt (Array.mapi (fun x y -> (x,y)) s)
-
+ let print fmt s = PRINT_TEMPLATE(NS)
let exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Mat)
let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Mat)
- (* inline by hand for efficiency reason *)
- let rec exec slot slot1 slot2 t code =
- match code with
- | Nil -> ()
- | Cons(dst, code, code1) ->
- exec_code slot slot1 slot2 t dst code;
- begin
- match code1 with
- | Nil -> ()
- | Cons(dst', code', code1') ->
- exec_code slot slot1 slot2 t dst' code';
- exec slot slot1 slot2 t code1'
- end
-
+ let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE
+ let exec slot slot1 slot2 t code = EXEC_TEMPLATE
let var _ x = x
let close _ x = x
let is_open _ = false
struct
module NS = U
type t = U.t array
- let print fmt s =
- let pr fmt (state, count) =
- fprintf fmt "%a: %i" State.print state (NS.length count)
- in
- Pretty.print_array ~sep:", " pr fmt (Array.mapi (fun x y -> (x,y)) s)
-
+ let print fmt s = PRINT_TEMPLATE(NS)
let exec_instr = EXEC_INSTR_TEMPLATE(U)
let exec_code = EXEC_CODE_TEMPLATE(U)
- (* inline by hand for efficiency reason *)
- let rec exec slot slot1 slot2 t code =
- match code with
- | Nil -> ()
- | Cons(dst, opcode, code1) ->
- TRACE("res-jit", 3, __ " %a := %a\n%!"
- State.print dst print_opcode opcode;
- );
- exec_code slot slot1 slot2 t dst opcode;
- begin
- match code1 with
- | Nil -> ()
- | Cons(dst, opcode, code1) ->
- TRACE("res-jit", 3, __ " %a := %a\n%!"
- State.print dst print_opcode opcode;
- );
- exec_code slot slot1 slot2 t dst opcode;
- exec slot slot1 slot2 t code1
- end
-
- let exec slot slot1 slot2 t code =
- TRACE("res-jit", 3, __ "Node %i:\n" (Node.to_int t));
- TRACE("res-jit", 3, __ " LEFT : %a\n" pr_slot slot1);
- TRACE("res-jit", 3, __ " RIGHT : %a\n" pr_slot slot2);
- exec slot slot1 slot2 t code;
- TRACE("res-jit", 3, __ " RES : %a\n\n%!" pr_slot slot)
-
-
+ let rec exec slot slot1 slot2 t code = EXEC_REC_TEMPLATE
+ let exec slot slot1 slot2 t code = EXEC_TEMPLATE
let var i t =
Array.mapi (fun j _ -> NS.var (i,j)) t
let close h t =