#include <pi_cond_jmp_rewriter.g.hh>
Inheritance diagram for lestes::backend_v2::workers::pi_cond_jmp_rewriter:

Public Member Functions | |
| void | process () |
| Rewrites conditional jumps. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_result () |
| Returns data of the currently processed function with rewritten jumps. | |
| virtual ptr< reflection_list > | reflection_get () const |
| for purposes of dumping | |
| virtual ptr< field_list_list > | field_values_get () const |
| for purposes of dumping | |
Static Public Member Functions | |
| static ptr< pi_cond_jmp_rewriter > | create (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) |
| First generated factory method for class pi_cond_jmp_rewriter. | |
Protected Member Functions | |
| pi_cond_jmp_rewriter (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) | |
| Generated constructor for class pi_cond_jmp_rewriter. | |
| virtual void | gc_mark () |
| Marking routine for class pi_cond_jmp_rewriter. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
A sequence like this (that are generated by the front-end):
cmp_res = cmp(a,b) boolean_res = set_boolean_if_greater(cmp_res) jump_if_false(label)
rewrites to:
cmp_res = cmp(a,b) jump_if_not_greater(cmp_res)
The result contains one less instruction and a target architecture likely supports instruction jump_if_not_greater.
Definition at line 48 of file pi_cond_jmp_rewriter.g.hh.
| lestes::backend_v2::workers::pi_cond_jmp_rewriter::pi_cond_jmp_rewriter | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [protected] |
Generated constructor for class pi_cond_jmp_rewriter.
Generated constructor for class pi_cond_jmp_rewriter.
Definition at line 36 of file pi_cond_jmp_rewriter.g.cc.
Referenced by create().
00037 : worker_base(a__worker_base__data) 00038 {}
| void lestes::backend_v2::workers::pi_cond_jmp_rewriter::process | ( | ) | [virtual] |
Rewrites conditional jumps.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 20 of file pi_cond_jmp_rewriter.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00020 { 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 }
| ptr< func_data > lestes::backend_v2::workers::pi_cond_jmp_rewriter::get_result | ( | ) | [virtual] |
Returns data of the currently processed function with rewritten jumps.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 135 of file pi_cond_jmp_rewriter.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00135 { 00136 return data_get(); 00137 }
| ptr< pi_cond_jmp_rewriter > lestes::backend_v2::workers::pi_cond_jmp_rewriter::create | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [static] |
First generated factory method for class pi_cond_jmp_rewriter.
This factory method for class pi_cond_jmp_rewriter takes values of all fields as arguments.
Definition at line 27 of file pi_cond_jmp_rewriter.g.cc.
References pi_cond_jmp_rewriter().
00028 { 00029 return ptr< pi_cond_jmp_rewriter > ( new pi_cond_jmp_rewriter(a__worker_base__data) ); 00030 }
| ptr< object::reflection_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 40 of file pi_cond_jmp_rewriter.g.cc.
References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().
00041 { 00042 if (!reflection) { 00043 typedef class_reflection::field_metadata md; 00044 typedef class_reflection::field_metadata_list mdlist; 00045 ptr<mdlist> mdl = mdlist::create(); 00046 reflection = reflection_list::create( worker_base::reflection_get() ); 00047 reflection->push_back( class_reflection::create( "pi_cond_jmp_rewriter", mdl ) ); 00048 } 00049 return reflection; 00050 }
| ptr< object::field_list_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 52 of file pi_cond_jmp_rewriter.g.cc.
References lestes::backend_v2::workers::worker_base::field_values_get().
00053 { 00054 ptr < field_list_list > result = worker_base::field_values_get(); 00055 return result; 00056 }
| void lestes::backend_v2::workers::pi_cond_jmp_rewriter::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class pi_cond_jmp_rewriter.
Marking routine is used for garbage collection.
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 63 of file pi_cond_jmp_rewriter.g.cc.
References lestes::backend_v2::workers::worker_base::gc_mark().
00064 { 00065 worker_base::gc_mark(); 00066 }
ptr< object::reflection_list > lestes::backend_v2::workers::pi_cond_jmp_rewriter::reflection = reflection [static, private] |
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 75 of file pi_cond_jmp_rewriter.g.hh.
Referenced by reflection_get().
1.5.1-20070107