include "joint/Joint_paolo.ma". inductive rtl_argument : Type[0] ≝ | Reg : register → rtl_argument | Imm : Byte → rtl_argument. coercion reg_to_rtl_argument : ∀r : register.rtl_argument ≝ Reg on _r : register to rtl_argument. coercion byte_to_rtl_argument : ∀b : Byte.rtl_argument ≝ Imm on _b : Byte to rtl_argument. definition imm_nat : nat → rtl_argument ≝ λn.Imm (nat_to_bv ? n). coercion nat_to_rtl_argument : ∀n : nat.rtl_argument ≝ imm_nat on _n : nat to rtl_argument. inductive rtl_seq : Type[0] ≝ | rtl_stack_address: register → register → rtl_seq. inductive rtl_call : Type[0] ≝ | rtl_call_ptr: register → register → list rtl_argument → list register → rtl_call. inductive rtl_tailcall : Type[0] ≝ | rtl_tailcall_id: ident → list rtl_argument → rtl_tailcall | rtl_tailcall_ptr: register → register → list rtl_argument → rtl_tailcall. definition rtl_uns_params ≝ mk_unserialized_params (mk_step_params (* acc_a_reg ≝ *) register (* acc_b_reg ≝ *) register (* acc_a_arg ≝ *) rtl_argument (* acc_b_arg ≝ *) rtl_argument (* dpl_reg ≝ *) register (* dph_reg ≝ *) register (* dpl_arg ≝ *) rtl_argument (* dph_arg ≝ *) rtl_argument (* snd_arg ≝ *) rtl_argument (* pair_move ≝ *) (register × rtl_argument) (* call_args ≝ *) (list rtl_argument) (* call_dest ≝ *) (list register) (* ext_seq ≝ *) rtl_seq (* ext_call ≝ *) rtl_call (* ext_tailcall ≝ *) rtl_tailcall ) (mk_local_params (mk_funct_params (* resultT ≝ *) (list register) (* paramsT ≝ *) (list register)) (* localsT ≝ *) register). definition rtl_params ≝ mk_graph_params rtl_uns_params. definition lin_rtl_params ≝ mk_lin_params rtl_uns_params. definition rtl_internal_function ≝ λglobals. joint_internal_function globals rtl_params. definition rtl_program ≝ joint_program rtl_params. definition rtl_step ≝ joint_step rtl_params. definition rtl_seq ≝ joint_seq rtl_params. definition rtl_statement ≝ joint_statement rtl_params. interpretation "move" 'mov r a = (MOVE ? ? (mk_Prod ? rtl_argument r a)). (* aid unification *) include "hints_declaration.ma". unification hint 0 ≔ (*---------------*) ⊢ acc_a_reg rtl_params ≡ register. unification hint 0 ≔ (*---------------*) ⊢ acc_b_reg rtl_params ≡ register. unification hint 0 ≔ (*---------------*) ⊢ acc_a_arg rtl_params ≡ rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ acc_b_arg rtl_params ≡ rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ dpl_reg rtl_params ≡ register. unification hint 0 ≔ (*---------------*) ⊢ dph_reg rtl_params ≡ register. unification hint 0 ≔ (*---------------*) ⊢ dpl_arg rtl_params ≡ rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ dph_arg rtl_params ≡ rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ snd_arg rtl_params ≡ rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ pair_move rtl_params ≡ register × rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ call_args rtl_params ≡ list rtl_argument. unification hint 0 ≔ (*---------------*) ⊢ call_dest rtl_params ≡ list register. unification hint 0 ≔ (*---------------*) ⊢ ext_seq rtl_params ≡ rtl_seq. unification hint 0 ≔ (*---------------*) ⊢ ext_call rtl_params ≡ rtl_call. unification hint 0 ≔ (*---------------*) ⊢ ext_tailcall rtl_params ≡ rtl_tailcall. unification hint 0 ≔ globals (*---------------*) ⊢ joint_step rtl_params globals ≡ rtl_step globals. unification hint 0 ≔ globals (*---------------*) ⊢ joint_seq rtl_params globals ≡ rtl_seq globals. unification hint 0 ≔ globals (*---------------*) ⊢ joint_statement (stmt_pars (graph_params_to_params rtl_params)) globals ≡ rtl_statement globals. coercion reg_to_rtl_snd_argument : ∀r : register.snd_arg rtl_params ≝ Reg on _r : register to snd_arg rtl_params. coercion byte_to_rtl_snd_argument : ∀b : Byte.snd_arg rtl_params ≝ Imm on _b : Byte to snd_arg rtl_params. (************ Same without tail calls ****************) definition rtlntc_params ≝ mk_graph_params (mk_unserialized_params (mk_step_params (* acc_a_reg ≝ *) register (* acc_b_reg ≝ *) register (* acc_a_arg ≝ *) rtl_argument (* acc_b_arg ≝ *) rtl_argument (* dpl_reg ≝ *) register (* dph_reg ≝ *) register (* dpl_arg ≝ *) rtl_argument (* dph_arg ≝ *) rtl_argument (* snd_arg ≝ *) rtl_argument (* pair_move ≝ *) (register × rtl_argument) (* call_args ≝ *) (list rtl_argument) (* call_dest ≝ *) (list register) (* ext_seq ≝ *) rtl_seq (* ext_call ≝ *) rtl_call (* ext_tailcall ≝ *) void ) (mk_local_params (mk_funct_params (* resultT ≝ *) (list register) (* paramsT ≝ *) (list register)) (* localsT ≝ *) register)). definition rtlntc_statement ≝ joint_statement (rtlntc_params : params). definition rtlntc_internal_function ≝ λglobals. joint_internal_function … globals rtlntc_params. definition rtlntc_program ≝ joint_program rtlntc_params.