INCLUDE "debug.ml"
INCLUDE "utils.ml"
+INCLUDE "trace.ml"
+
open Format
type instr =
;;
*)
-DEFINE SET(a, b) = a <- b
+DEFINE SET(a, b) = (a) <- (b)
DEFINE EXEC_INSTR_TEMPLATE(ns) = fun slot1 slot2 t inst acc ->
match inst with
| OP_NOP _ -> ()
| OP_LEFT1 src ->
- if slot != slot1 then SET(slot.(dst), slot1.(src))
+ SET(slot.(dst), slot1.(src))
| OP_LEFT2 (src1, src2) ->
- SET(slot.(dst) , ns.concat slot1.(src1) slot1.(src2))
+ SET(slot.(dst) , ns.concat slot1.(src1) slot1.(src2))
- | OP_RIGHT1 src -> if slot != slot2 then SET(slot.(dst) , slot2.(src))
+ | OP_RIGHT1 src -> SET(slot.(dst) , slot2.(src))
| OP_RIGHT2 (src1, src2) ->
SET (slot.(dst) , ns.concat slot2.(src1) slot2.(src2) )
| OP_LEFT1_RIGHT1 (src1, src2) ->
- SET (slot.(dst) , ns.concat slot1.(src1) slot2.(src2))
+ SET (slot.(dst) , ns.concat slot1.(src1) slot2.(src2))
| OP_LEFT2_RIGHT1 (src1, src2, src3) ->
- SET (slot.(dst) , ns.concat3 slot1.(src1) slot1.(src2) slot2.(src3))
+ SET (slot.(dst) , ns.concat3 slot1.(src1) slot1.(src2) slot2.(src3))
| OP_LEFT1_RIGHT2 (src1, src2, src3) ->
- SET (slot.(dst) , ns.concat3 slot1.(src1) slot2.(src2) slot2.(src3))
+ SET (slot.(dst) , ns.concat3 slot1.(src1) slot2.(src2) slot2.(src3));
| OP_LEFT2_RIGHT2 (src1, src2, src3, src4) ->
SET (slot.(dst) , ns.concat4 slot1.(src1) slot1.(src2) slot2.(src3) slot2.(src4))
module NS : NodeSet.S
type t = NS.t array
val exec : t -> t -> t -> Tree.node -> code -> unit
+ val print : Format.formatter -> t -> unit
+ val var : int -> t -> t
+ val close : ((int*State.t, NS.t) Hashtbl.t) -> t -> t
+ val is_open : t -> bool
end
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 exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Count)
let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Count)
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
+ | 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 var _ x = x
+ let close _ x = x
+
+ let is_open _ = false
end
module Mat =
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 exec_instr = EXEC_INSTR_TEMPLATE(NodeSet.Mat)
let exec_code = EXEC_CODE_TEMPLATE(NodeSet.Mat)
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
+ | Nil -> ()
+ | Cons(dst', code', code1') ->
+ exec_code slot slot1 slot2 t dst' code';
+ exec slot slot1 slot2 t code1'
end
+
+ let var _ x = x
+ let close _ x = x
+ let is_open _ = false
end
+module Make(U : NodeSet.S) =
+ 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 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 var i t =
+ Array.mapi (fun j _ -> NS.var (i,j)) t
+ let close h t =
+ Array.map (NS.close h) t
+
+ let is_open t =
+ List.exists NS.is_open (Array.to_list t)
+ end