test.ml 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. open Match
  2. open Fuzz
  3. open Cgen
  4. (* unit tests *)
  5. let test_pattern_match =
  6. let pm = pattern_match
  7. and nm = fun x y -> not (pattern_match x y) in
  8. begin
  9. assert (nm (Atm Tmp) (Atm (Con 42L)));
  10. assert (pm (Atm AnyCon) (Atm (Con 42L)));
  11. assert (nm (Atm (Con 42L)) (Atm AnyCon));
  12. assert (nm (Atm (Con 42L)) (Atm Tmp));
  13. end
  14. let test_peel =
  15. let o = Kw, Oadd in
  16. let p = Bnr (o, Bnr (o, Atm Tmp, Atm Tmp),
  17. Atm (Con 42L)) in
  18. let l = peel p () in
  19. let () = assert (List.length l = 3) in
  20. let atomic_p (p, _) =
  21. match p with Atm _ -> true | _ -> false in
  22. let () = assert (List.for_all atomic_p l) in
  23. let l = List.map (fun (p, c) -> fold_cursor c p) l in
  24. let () = assert (List.for_all ((=) p) l) in
  25. ()
  26. let test_fold_pairs =
  27. let l = [1; 2; 3; 4; 5] in
  28. let p = fold_pairs l l [] (fun a b -> a :: b) in
  29. let () = assert (List.length p = 25) in
  30. let p = sort_uniq compare p in
  31. let () = assert (List.length p = 25) in
  32. ()
  33. (* test pattern & state *)
  34. let print_sm oc =
  35. StateMap.iter (fun k s' ->
  36. match k with
  37. | K (o, sl, sr) ->
  38. let top =
  39. List.fold_left (fun top c ->
  40. match c with
  41. | Top r -> top ^ " " ^ r
  42. | _ -> top) "" s'.point
  43. in
  44. Printf.fprintf oc
  45. " (%s %d %d) -> %d%s\n"
  46. (show_op o)
  47. sl.id sr.id s'.id top)
  48. let rules =
  49. let oa = Kl, Oadd in
  50. let om = Kl, Omul in
  51. let va = Var ("a", Tmp)
  52. and vb = Var ("b", Tmp)
  53. and vc = Var ("c", Tmp)
  54. and vs = Var ("s", Tmp) in
  55. let vars = ["a"; "b"; "c"; "s"] in
  56. let rule name pattern =
  57. List.map
  58. (fun pattern -> {name; vars; pattern})
  59. (ac_equiv pattern)
  60. in
  61. match `X64Addr with
  62. (* ------------------------------- *)
  63. | `X64Addr ->
  64. (* o + b *)
  65. rule "ob" (Bnr (oa, Atm Tmp, Atm AnyCon))
  66. @ (* b + s * m *)
  67. rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 2L), vs)))
  68. @
  69. rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 4L), vs)))
  70. @
  71. rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 8L), vs)))
  72. @ (* b + s *)
  73. rule "bs1" (Bnr (oa, vb, vs))
  74. @ (* o + s * m *)
  75. (* rule "osm" (Bnr (oa, Atm AnyCon, Bnr (om, Atm (Con 4L), Atm Tmp))) *) []
  76. @ (* o + b + s *)
  77. rule "obs1" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb), vs))
  78. @ (* o + b + s * m *)
  79. rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
  80. Bnr (om, Var ("m", Con 2L), vs)))
  81. @
  82. rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
  83. Bnr (om, Var ("m", Con 4L), vs)))
  84. @
  85. rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
  86. Bnr (om, Var ("m", Con 8L), vs)))
  87. (* ------------------------------- *)
  88. | `Add3 ->
  89. [ { name = "add"
  90. ; vars = []
  91. ; pattern = Bnr (oa, va, Bnr (oa, vb, vc)) } ] @
  92. [ { name = "add"
  93. ; vars = []
  94. ; pattern = Bnr (oa, Bnr (oa, va, vb), vc) } ]
  95. (*
  96. let sa, am, sm = generate_table rules
  97. let () =
  98. Array.iteri (fun i s ->
  99. Format.printf "@[state %d: %s@]@."
  100. i (show_pattern s.seen))
  101. sa
  102. let () = print_sm stdout sm; flush stdout
  103. let matcher = lr_matcher sm sa rules "obsm" (* XXX *)
  104. let () = Format.printf "@[<v>%a@]@." Action.pp matcher
  105. let () = Format.printf "@[matcher size: %d@]@." (Action.size matcher)
  106. let numbr = make_numberer sa am sm
  107. let () =
  108. let opts = { pfx = ""
  109. ; static = true
  110. ; oc = stdout } in
  111. emit_c opts numbr;
  112. emit_matchers opts
  113. [ ( ["b"; "o"; "s"; "m"]
  114. , "obsm"
  115. , matcher ) ]
  116. (*
  117. let tp = fuzz_numberer rules numbr
  118. let () = test_matchers tp numbr rules
  119. *)
  120. *)