aboutsummaryrefslogtreecommitdiffstats
path: root/src/pipelining/SPBase_types.ml
blob: ba92340df21963e88556ef0bf336ba2c7ca1b078 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
(***********************************************************************)
(*                                                                     *)
(*                        Compcert Extensions                          *)
(*                                                                     *)
(*                       Jean-Baptiste Tristan                         *)
(*                                                                     *)
(*  All rights reserved.  This file is distributed under the terms     *)
(*  described in file ../../LICENSE.                                   *)
(*                                                                     *)
(***********************************************************************)


open Camlcoq
open Op
open Registers
open Memory
open Mem
open AST

type ('a,'b) sum = ('a,'b) Datatypes.sum

type instruction =
  | Inop 
  | Iop of operation * reg list * reg
  | Iload of memory_chunk * addressing * reg list * reg
  | Istore of memory_chunk * addressing * reg list * reg
  | Icall of signature * (reg, ident) sum * reg list * reg
  | Itailcall of signature * (reg, ident) sum * reg list
  | Icond of condition * reg list
  | Ireturn of reg option

type resource = Reg of reg | Mem

let inst_coq_to_caml = function 
  | RTL.Inop succ -> Inop
  | RTL.Iop (op, args, dst, succ) -> Iop (op, args, dst)
  | RTL.Iload (chunk, mode, args, dst, succ) -> Iload (chunk, mode, args, dst)
  | RTL.Istore (chunk, mode, args, src, succ) -> Istore (chunk, mode, args, src)
  | RTL.Icall (sign, id, args, dst, succ) -> Icall (sign, id, args, dst)
  | RTL.Itailcall (sign, id, args) -> Itailcall (sign, id, args)
  | RTL.Icond (cond, args, succ1, succ2) -> Icond (cond, args)
  | RTL.Ireturn (res) -> Ireturn (res)
 
let inst_caml_to_coq i (links : RTL.node list) =
  match i,links with 
  | Inop,[p] -> RTL.Inop p
  | Iop (op, args, dst),[p] -> RTL.Iop (op, args, dst,p)  
  | Iload (chunk, mode, args, dst),[p] -> RTL.Iload (chunk, mode, args,dst,p) 
  | Istore (chunk, mode, args, src),[p] -> RTL.Istore (chunk, mode, args, src,p)  
  | Icall (sign, id, args, dst),[p] -> RTL.Icall (sign, id, args, dst,p) 
  | Itailcall (sign, id, args),[] -> RTL.Itailcall (sign, id, args) 
  | Icond (cond, args),[p1;p2] -> RTL.Icond (cond,args,p1,p2)
  | Ireturn (res),[] -> RTL.Ireturn res 
  | _,_ -> failwith "Echec lors de la conversion des instrucitons internes vers compcert"


let print_inst node = string_of_int (snd node)

let to_int = fun n -> P.to_int n
let to_binpos = fun n -> P.of_int n

let rec string_of_args args =
  match args with
    | [] -> ""
    | arg :: args -> "r" ^ (string_of_int (to_int arg)) ^ " " ^ string_of_args args

let string_of_z z = string_of_int (Z.to_int z)

let string_of_comparison = function
  | Integers.Ceq -> "eq"
  | Integers.Cne -> "ne"
  | Integers.Clt -> "lt"
  | Integers.Cle -> "le"
  | Integers.Cgt -> "gt"
  | Integers.Cge -> "ge"
 
let string_of_cond = function
  | Ccomp c -> Printf.sprintf "comp %s" (string_of_comparison c)
  | Ccompu c -> Printf.sprintf "compu %s" (string_of_comparison c)
  | Ccompimm (c,i) -> Printf.sprintf "compimm %s %s" (string_of_comparison c) (string_of_z i)
  | Ccompuimm (c,i) -> Printf.sprintf "compuimm %s %s" (string_of_comparison c) (string_of_z i)
  | Ccompf c -> Printf.sprintf "compf %s" (string_of_comparison c)
  | Cnotcompf c -> Printf.sprintf "notcompf %s" (string_of_comparison c)
  | Cmaskzero i -> Printf.sprintf "maskzero %s" (string_of_z i)
  | Cmasknotzero i -> Printf.sprintf "masknotzero %s" (string_of_z i)

let string_of_op = function
  | Omove -> "move"
  | Ointconst i -> Printf.sprintf "intconst %s" (string_of_z i)
  | Ofloatconst f -> Printf.sprintf "floatconst %s" (string_of_float (camlfloat_of_coqfloat32 f))
  | Ocast8signed -> "cast8signed"
  | Ocast8unsigned -> "cast8unsigned"
  | Ocast16signed -> "cast16signed"
  | Ocast16unsigned -> "cast16unsigned"
  | Osub -> "sub"
  | Omul -> "mul"
  | Omulimm i -> Printf.sprintf "mulimm %s" (string_of_z i)
  | Odiv -> "div"
  | Odivu -> "divu"
  | Oand -> "and"
  | Oandimm i -> Printf.sprintf "andimm %s" (string_of_z i)
  | Oor -> "or"
  | Oorimm i -> Printf.sprintf "orimm %s" (string_of_z i)
  | Oxor -> "xor"
  | Oxorimm i -> Printf.sprintf "xorimm %s" (string_of_z i)
  | Oshl -> "shl"
  | Oshr -> "shr"
  | Oshrimm i -> Printf.sprintf "shrimm %s" (string_of_z i)
  | Oshrximm i -> Printf.sprintf "shrximm %s" (string_of_z i)
  | Oshru -> "shru"
  | Onegf -> "negf"
  | Oabsf -> "absf"
  | Oaddf -> "addf"
  | Osubf -> "subf"
  | Omulf -> "mulf"
  | Odivf -> "divf"
  | Osingleoffloat -> "singleoffloat"
  | Ofloatofint -> "floatofint"
  | Ocmp c -> Printf.sprintf "cmpcmpcmp"
  | Olea _ -> "lea"
  
let to_coq_list = function
  | [] -> []
  | e :: l -> e :: l

let to_caml_list = function
  | [] -> []
  | e :: l -> e :: l