00001 #include <lestes/backend_v2/structs/func_data.g.hh>
00002 #include <lestes/backend_v2/workers/pi_cond_jmp_rewriter.g.hh>
00003 #include <lestes/backend_v2/intercode/pi.g.hh>
00004 #include <lestes/backend_v2/intercode/visitor_pi_pi2id.g.hh>
00005 #include <lestes/md/types/ss_type2tm_type_convertor.g.hh>
00006
00007 package(lestes);
00008 package(backend_v2);
00009 package(workers);
00010
00011 using namespace ::lestes::backend_v2::intercode;
00012 using namespace ::lestes::backend_v2::structs;
00013 using namespace ::lestes::md::types;
00014
00015 typedef list<srp<pi_pi> > pi_list__type;
00016
00017
00018
00019
00020 void pi_cond_jmp_rewriter::process() {
00021
00022 ptr<visitor_pi_pi2id> pi_id_getter = visitor_pi_pi2id::create();
00023
00024 ptr<pi_list__type> body = data_get()->pi_body_get();
00025
00026 for(pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) {
00027
00028 if ( visitor_pi_pi2id::PI_BF!= (visitor_pi_pi2id::kind_type)(*it)->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00029 continue;
00030 }
00031
00032 ptr<pi_bf> bf = (*it).dncast<pi_bf>();
00033 ptr<pi_pi> setter_generic = bf->condition_get()->origin_get();
00034
00035 ptr<pi_preg> out_cmp_res = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->conditional_preg_type_get());
00036
00037 ptr<pi_cb_single_label_target> out_jmp = NULL;
00038 ptr<pi_tdtpi> setter = NULL;
00039
00040 switch (setter_generic->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00041 case visitor_pi_pi2id::PI_SBG: {
00042 setter = setter_generic.dncast<pi_tdtpi>();
00043
00044 out_jmp = pi_bng::create(
00045 bf->psp_get(),
00046 bf->nsp_get(),
00047 bf->level_get(),
00048 out_cmp_res,
00049 bf->destination_get());
00050 } break;
00051
00052 case visitor_pi_pi2id::PI_SBL: {
00053 setter = setter_generic.dncast<pi_tdtpi>();
00054
00055 out_jmp = pi_bnl::create(
00056 bf->psp_get(),
00057 bf->nsp_get(),
00058 bf->level_get(),
00059 out_cmp_res,
00060 bf->destination_get());
00061 } break;
00062
00063 case visitor_pi_pi2id::PI_SBE: {
00064 setter = setter_generic.dncast<pi_tdtpi>();
00065
00066 out_jmp = pi_bne::create(
00067 bf->psp_get(),
00068 bf->nsp_get(),
00069 bf->level_get(),
00070 out_cmp_res,
00071 bf->destination_get());
00072 } break;
00073
00074 case visitor_pi_pi2id::PI_SBNG: {
00075 setter = setter_generic.dncast<pi_tdtpi>();
00076
00077 out_jmp = pi_bg::create(
00078 bf->psp_get(),
00079 bf->nsp_get(),
00080 bf->level_get(),
00081 out_cmp_res,
00082 bf->destination_get());
00083 } break;
00084
00085 case visitor_pi_pi2id::PI_SBNL: {
00086 setter = setter_generic.dncast<pi_tdtpi>();
00087
00088 out_jmp = pi_bl::create(
00089 bf->psp_get(),
00090 bf->nsp_get(),
00091 bf->level_get(),
00092 out_cmp_res,
00093 bf->destination_get());
00094 } break;
00095
00096 case visitor_pi_pi2id::PI_SBNE: {
00097 setter = setter_generic.dncast<pi_tdtpi>();
00098
00099 out_jmp = pi_be::create(
00100 bf->psp_get(),
00101 bf->nsp_get(),
00102 bf->level_get(),
00103 out_cmp_res,
00104 bf->destination_get());
00105 } break;
00106
00107 }
00108
00109 if ( !out_jmp ) {
00110 continue;
00111 }
00112
00113 ptr<pi_cmp> out_cmp = pi_cmp::create(
00114 setter->psp_get(),
00115 setter->nsp_get(),
00116 setter->level_get(),
00117 setter->left_get(),
00118 setter->right_get(),
00119 out_cmp_res,
00120 out_cmp_res->type_get(),
00121 setter->type2_get());
00122
00123 out_cmp_res->origin_set(out_cmp);
00124
00125 pi_list__type::iterator it_replace = ::std::find(body->begin(),body->end(),setter);
00126
00127 *it_replace = out_cmp;
00128 *it = out_jmp;
00129 }
00130 }
00131
00132
00133
00134
00135 ptr<func_data> pi_cond_jmp_rewriter::get_result() {
00136 return data_get();
00137 }
00138
00139 end_package(workers);
00140 end_package(backend_v2);
00141 end_package(lestes);
00142