00001 #include <lestes/backend_v2/intercode/visitor_pi_pi2pi_operands.g.hh>
00002 #include <lestes/backend_v2/intercode/pi.g.hh>
00003 #include <lestes/backend_v2/structs/pi_operands.g.hh>
00004 #include <lestes/md/types/tm_data_type_base.g.hh>
00005
00006 package(lestes);
00007 package(backend_v2);
00008 package(intercode);
00009
00010 using ::lestes::md::types::tm_data_type_base;
00011 using ::lestes::backend_v2::structs::pi_operands;
00012
00013 typedef vector<srp<pi_operand> > pi_operand_vector__type;
00014 typedef list<srp<pi_mem> > pi_mem_list_type;
00015 typedef list<srp<pi_operand> > pi_operand_list_type;
00016 typedef vector<srp<tm_data_type_base> > tm_data_type_vector__type;
00017 typedef vector<srp<pi_sp> > pi_sp_vector__type;
00018
00019 #define CREATE_PI_OPERANDS_LISTS() \
00020 ptr<pi_operand_vector__type> in_ops = pi_operand_vector__type::create(); \
00021 ptr<pi_operand_vector__type> out_ops = pi_operand_vector__type::create(); \
00022 ptr<tm_data_type_vector__type> in_types = tm_data_type_vector__type::create(); \
00023 ptr<tm_data_type_vector__type> out_types = tm_data_type_vector__type::create(); \
00024 ptr<pi_sp_vector__type> jmp_targets = pi_sp_vector__type::create();
00025
00026
00027
00028 ptr< pi_operands > visitor_pi_pi2pi_operands::tstpi_operands_get(ptr< pi_tstpi > pi) {
00029 CREATE_PI_OPERANDS_LISTS();
00030
00031 in_ops->push_back(pi->left_get());
00032 in_types->push_back(pi->type_get());
00033 in_ops->push_back(pi->right_get());
00034 in_types->push_back(pi->type_get());
00035
00036 out_ops->push_back(pi->destination_get());
00037 out_types->push_back(pi->type_get());
00038
00039 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00040 }
00041
00042 ptr< pi_operands > visitor_pi_pi2pi_operands::tdtpi_operands_get(ptr< pi_tdtpi > pi){
00043 CREATE_PI_OPERANDS_LISTS();
00044
00045 in_ops->push_back(pi->left_get());
00046 in_types->push_back(pi->type2_get());
00047 in_ops->push_back(pi->right_get());
00048 in_types->push_back(pi->type2_get());
00049
00050 out_ops->push_back(pi->destination_get());
00051 out_types->push_back(pi->type1_get());
00052
00053 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00054
00055 }
00056
00057 ptr< pi_operands > visitor_pi_pi2pi_operands::bstpi_operands_get(ptr< pi_bstpi > pi){
00058 CREATE_PI_OPERANDS_LISTS();
00059
00060 in_ops->push_back(pi->source_get());
00061 in_types->push_back(pi->type_get());
00062
00063 out_ops->push_back(pi->destination_get());
00064 out_types->push_back(pi->type_get());
00065
00066 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00067 }
00068
00069 ptr< pi_operands > visitor_pi_pi2pi_operands::bdtpi_operands_get(ptr< pi_bdtpi > pi){
00070 CREATE_PI_OPERANDS_LISTS();
00071
00072 in_ops->push_back(pi->source_get());
00073 in_types->push_back(pi->type2_get());
00074
00075 out_ops->push_back(pi->destination_get());
00076 out_types->push_back(pi->type1_get());
00077
00078 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00079 }
00080
00081 ptr< pi_operands > visitor_pi_pi2pi_operands::st_move_operands_get(ptr< pi_abstract_move_st > pi){
00082 CREATE_PI_OPERANDS_LISTS();
00083
00084 in_ops->push_back(pi->source_get());
00085 in_types->push_back(pi->type_get());
00086
00087 out_ops->push_back(pi->destination_get());
00088 out_types->push_back(pi->type_get());
00089
00090 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00091 }
00092
00093 ptr< pi_operands > visitor_pi_pi2pi_operands::dt_move_operands_get(ptr< pi_abstract_move_dt > pi){
00094 CREATE_PI_OPERANDS_LISTS();
00095
00096 in_ops->push_back(pi->source_get());
00097 in_types->push_back(pi->type2_get());
00098
00099 out_ops->push_back(pi->destination_get());
00100 out_types->push_back(pi->type1_get());
00101
00102 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00103 }
00104
00105 ptr< pi_operands > visitor_pi_pi2pi_operands::sbp_operands_get(ptr< pi_indirect_store > pi){
00106 CREATE_PI_OPERANDS_LISTS();
00107
00108 out_ops->push_back(pi->address_get());
00109 out_types->push_back(pi->type1_get());
00110 in_ops->push_back(pi->value_get());
00111 in_types->push_back(pi->type2_get());
00112 in_ops->push_back(pi->address_get()->factory_get().dncast<pi_mf_ptr_deref>()->addr_get());
00113 in_types->push_back(pi->address_get()->factory_get().dncast<pi_mf_ptr_deref>()->addr_get()->type_get());
00114
00115 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00116 }
00117
00118 ptr< pi_operands > visitor_pi_pi2pi_operands::lbp_operands_get(ptr< pi_indirect_load > pi){
00119 CREATE_PI_OPERANDS_LISTS();
00120
00121 out_ops->push_back(pi->value_get());
00122 out_types->push_back(pi->type1_get());
00123
00124 in_ops->push_back(pi->address_get());
00125 in_types->push_back(pi->type2_get());
00126 in_ops->push_back(pi->address_get()->factory_get().dncast<pi_mf_ptr_deref>()->addr_get());
00127 in_types->push_back(pi->address_get()->factory_get().dncast<pi_mf_ptr_deref>()->addr_get()->type_get());
00128
00129 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00130 }
00131
00132 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_sp(ptr< pi_sp >){
00133 CREATE_PI_OPERANDS_LISTS();
00134 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00135 }
00136
00137 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_leave(ptr< pi_leave >){
00138 CREATE_PI_OPERANDS_LISTS();
00139
00140 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00141 }
00142
00143 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_call(ptr< pi_call > pi){
00144 CREATE_PI_OPERANDS_LISTS();
00145
00146 pi_operand_list_type::iterator it;
00147 for(it=pi->args_get()->begin(); it!=pi->args_get()->end(); it++) {
00148 in_ops->push_back(*it);
00149 in_types->push_back((*it)->type_get());
00150 }
00151
00152 if ( pi->this_arg_get() ) {
00153 in_ops->push_back(pi->this_arg_get());
00154 in_types->push_back(pi->this_arg_get()->type_get());
00155 }
00156
00157 out_ops->push_back(pi->rv_get());
00158 out_types->push_back(pi->rv_get()->type_get());
00159
00160 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00161 }
00162
00163 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_icall(ptr< pi_icall >){
00164 lassert2(false,msg_not_implemented_yet);
00165 return pi_operands::create(NULL, NULL, NULL, NULL,NULL);
00166 }
00167
00168 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_callv(ptr< pi_callv > pi){
00169 CREATE_PI_OPERANDS_LISTS();
00170
00171 pi_operand_list_type::iterator it;
00172 for(it=pi->args_get()->begin(); it!=pi->args_get()->end(); it++) {
00173 in_ops->push_back(*it);
00174 in_types->push_back((*it)->type_get());
00175 }
00176
00177 if ( pi->this_arg_get() ) {
00178 in_ops->push_back(pi->this_arg_get());
00179 in_types->push_back(pi->this_arg_get()->type_get());
00180 }
00181 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00182 }
00183
00184 ptr< pi_operands > visitor_pi_pi2pi_operands::visit_pi_icallv(ptr< pi_icallv >){
00185 lassert2(false,msg_not_implemented_yet);
00186 return NULL;
00187 }
00188
00189 ptr< pi_operands > visitor_pi_pi2pi_operands::cb_sl_operands_get(ptr< pi_cb_single_label_target > pi) {
00190 CREATE_PI_OPERANDS_LISTS();
00191
00192 in_ops->push_back(pi->condition_get());
00193 in_types->push_back(pi->condition_get()->type_get());
00194
00195 jmp_targets->push_back(pi->destination_get());
00196
00197 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00198 }
00199
00200 ptr< pi_operands > visitor_pi_pi2pi_operands::cb_sa_operands_get(ptr< pi_cb_single_address_target >) {
00201 lassert2(false,msg_not_implemented_yet);
00202 return NULL;
00203 }
00204
00205 ptr< pi_operands > visitor_pi_pi2pi_operands::ub_sl_operands_get(ptr< pi_ub_single_label_target > pi) {
00206 CREATE_PI_OPERANDS_LISTS();
00207
00208 jmp_targets->push_back(pi->destination_get());
00209
00210 return pi_operands::create(in_ops, out_ops, in_types, out_types, jmp_targets);
00211 }
00212
00213 ptr< pi_operands > visitor_pi_pi2pi_operands::ub_sa_operands_get(ptr< pi_ub_single_address_target >) {
00214 lassert2(false,msg_not_implemented_yet);
00215 return NULL;
00216 }
00217
00218 ptr< pi_operands > visitor_pi_pi2pi_operands::bm_l_operands_get(ptr< pi_branch_multiple_label_target >) {
00219 lassert2(false,msg_not_implemented_yet);
00220 return NULL;
00221 }
00222
00223 ptr< pi_operands > visitor_pi_pi2pi_operands::bm_a_operands_get(ptr< pi_branch_multiple_address_target >) {
00224 lassert2(false,msg_not_implemented_yet);
00225 return NULL;
00226 }
00227
00228 end_package(intercode);
00229 end_package(backend_v2);
00230 end_package(lestes);
00231