1 | (**************************************************************************) |
---|
2 | (* ___ *) |
---|
3 | (* ||M|| *) |
---|
4 | (* ||A|| A project by Andrea Asperti *) |
---|
5 | (* ||T|| *) |
---|
6 | (* ||I|| Developers: *) |
---|
7 | (* ||T|| The HELM team. *) |
---|
8 | (* ||A|| http://helm.cs.unibo.it *) |
---|
9 | (* \ / *) |
---|
10 | (* \ / This file is distributed under the terms of the *) |
---|
11 | (* v GNU General Public License Version 2 *) |
---|
12 | (* *) |
---|
13 | (**************************************************************************) |
---|
14 | |
---|
15 | include "ERTL/ERTL.ma". |
---|
16 | include "ERTLptr/ERTLptr.ma". |
---|
17 | include "joint/TranslateUtils.ma". |
---|
18 | |
---|
19 | definition seq_embed : |
---|
20 | ∀globals.(joint_seq ERTL globals) → (joint_seq ERTLptr globals) ≝ |
---|
21 | λglobals,s. |
---|
22 | match s with |
---|
23 | [COMMENT s ⇒ COMMENT ERTLptr … s |
---|
24 | |COST_LABEL c ⇒ COST_LABEL ERTLptr … c |
---|
25 | |MOVE a ⇒ MOVE ERTLptr … a |
---|
26 | |POP a ⇒ POP ERTLptr … a |
---|
27 | |PUSH a ⇒ PUSH ERTLptr … a |
---|
28 | |ADDRESS i H reg1 reg2 ⇒ ADDRESS ERTLptr … i H reg1 reg2 |
---|
29 | |OPACCS op reg1 reg2 reg3 reg4 ⇒ OPACCS ERTLptr … op reg1 reg2 reg3 reg4 |
---|
30 | |OP1 op reg1 reg2 ⇒ OP1 ERTLptr … op reg1 reg2 |
---|
31 | |OP2 op reg1 reg2 arg ⇒ OP2 ERTLptr … op reg1 reg2 arg |
---|
32 | |CLEAR_CARRY ⇒ CLEAR_CARRY ERTLptr ? |
---|
33 | |SET_CARRY ⇒ SET_CARRY ERTLptr ? |
---|
34 | |LOAD reg1 reg2 reg3 ⇒ LOAD ERTLptr … reg1 reg2 reg3 |
---|
35 | |STORE arg1 arg2 reg ⇒ STORE ERTLptr … arg1 arg2 reg |
---|
36 | |extension_seq s ⇒ extension_seq ERTLptr … (ertlptr_ertl s) |
---|
37 | ]. |
---|
38 | |
---|
39 | definition translate_step: |
---|
40 | ∀globals. |
---|
41 | unit → |
---|
42 | label |
---|
43 | →joint_step ERTL globals |
---|
44 | →bind_step_block ERTLptr globals ≝ |
---|
45 | λglobals.λ_.λl.λs. |
---|
46 | match s return λ_.bind_step_block ERTLptr globals with |
---|
47 | [ CALL called args dest ⇒ |
---|
48 | match called return λ_.bind_step_block ERTLptr globals with |
---|
49 | [inl id ⇒ bret … 〈[ ], λ_.CALL ERTLptr ? (inl … id) args dest, [ ]〉 |
---|
50 | |inr dest1 ⇒ νreg in bret ? (step_block ERTLptr globals) |
---|
51 | 〈[λl.(LOW_ADDRESS reg l : joint_seq ??); |
---|
52 | λ_.PUSH ERTLptr … (Reg … reg); |
---|
53 | λl.HIGH_ADDRESS reg l; |
---|
54 | λ_.PUSH ERTLptr … (Reg … reg)], |
---|
55 | λ_.CALL ERTLptr ? (inr … dest1) args dest, [ ]〉 |
---|
56 | ] |
---|
57 | | COND reg l ⇒ bret … 〈[ ], λ_.COND ERTLptr ? reg l, [ ]〉 |
---|
58 | | step_seq x ⇒ bret … [seq_embed … x] |
---|
59 | ]. |
---|
60 | |
---|
61 | definition fin_step_embed: joint_fin_step ERTL → joint_fin_step ERTLptr ≝ |
---|
62 | λs. |
---|
63 | match s with |
---|
64 | [GOTO l ⇒ GOTO ERTLptr … l |
---|
65 | |RETURN ⇒ RETURN ERTLptr |
---|
66 | |TAILCALL H arg arg' ⇒ TAILCALL ERTLptr … H arg arg' |
---|
67 | ]. |
---|
68 | |
---|
69 | definition translate_fin_step: |
---|
70 | ∀globals. |
---|
71 | unit → |
---|
72 | label |
---|
73 | →joint_fin_step ERTL |
---|
74 | →bind_fin_block ERTLptr globals ≝ |
---|
75 | λglobals.λ_.λl.λs.bret … 〈[ ], fin_step_embed … s〉. |
---|
76 | |
---|
77 | definition ertl_to_ertlptr: ertl_program → ertlptr_program ≝ |
---|
78 | b_graph_transform_program ERTL ERTLptr (λ_.unit) |
---|
79 | (λglobals,int_fun. |
---|
80 | 〈〈joint_if_result … int_fun, |
---|
81 | joint_if_params … int_fun, |
---|
82 | joint_if_stacksize … int_fun〉, |
---|
83 | it〉) |
---|
84 | translate_step |
---|
85 | translate_fin_step. |
---|