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

Public Member Functions | |
| void | process () |
| Performs inlining of memory operands. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_result () |
| Returns data of the currently processed function with immediates inlined whereever possible. | |
| bool | find_compatible_version (ptr< ::lestes::backend_v2::intercode::ge_pi > ge) |
| 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< memory_inliner > | create (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) |
| First generated factory method for class memory_inliner. | |
Protected Member Functions | |
| memory_inliner (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) | |
| Generated constructor for class memory_inliner. | |
| virtual void | gc_mark () |
| Marking routine for class memory_inliner. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
Definition at line 40 of file memory_inliner.g.hh.
| lestes::backend_v2::workers::memory_inliner::memory_inliner | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [protected] |
Generated constructor for class memory_inliner.
Generated constructor for class memory_inliner.
Definition at line 37 of file memory_inliner.g.cc.
Referenced by create().
00038 : worker_base(a__worker_base__data) 00039 {}
| void lestes::backend_v2::workers::memory_inliner::process | ( | ) | [virtual] |
Performs inlining of memory operands.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 27 of file memory_inliner.cc.
References lestes::backend_v2::workers::worker_base::data_get(), and find_compatible_version().
00027 { 00028 00029 ptr<reg2mem__type> reg2mem = reg2mem__type::create(); 00030 00031 ptr<ge_pi_list__type> body = data_get()->ge_body_get(); 00032 00033 for(ge_pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) { 00034 ptr<ge_pi> ge = *it; 00035 ptr<tm_instr_base> tm = ge->instruction_get(); 00036 00037 if ( !tm ) { 00038 continue; 00039 } 00040 00041 if ( tm->is_load() 00042 && ge->operands_input_get()->front()->kind_get()==ge_operand::MEMORY 00043 && ge->operands_output_get()->front()->kind_get()==ge_operand::REGISTER ) { 00044 //The instruction is load instruction that loads memory operand to register. 00045 ptr<ge_operand_mem> mem = ge->operands_input_get()->front().dncast<ge_operand_mem>(); 00046 00047 //Note: Do not inline pi_mf_ptr_deref. 00048 if ( mem->factory_get() && mem->factory_get()->kind_get()!=pi_mem_factory::MF_PTR_DEREF ) { 00049 (*reg2mem)[ge->operands_output_get()->front().dncast<ge_operand_reg>()] = mem; 00050 } 00051 } else if ( tm->versions_get() ) { 00052 //The instruction has exchangeable tm_instr version available. 00053 //Go through input operands and search for a register operand that can be echanged for its immediate source. 00054 ptr<ge_op_vector__type> operands = ge->operands_input_get(); 00055 for(ge_op_vector__type::iterator it_op = operands->begin(); it_op!=operands->end();) { 00056 if ( (*it_op)->kind_get()!=ge_operand::REGISTER ) { 00057 ++it_op; 00058 continue; 00059 } 00060 00061 ptr<ge_operand_reg> reg = (*it_op).dncast<ge_operand_reg>(); 00062 00063 reg2mem__type::iterator it_mem = reg2mem->find(reg); 00064 00065 if ( it_mem==reg2mem->end() ) { 00066 ++it_op; 00067 continue; 00068 } 00069 00070 //Ok, the immediate source has been found. 00071 ptr<ge_operand_mem> mem = it_mem->second; 00072 00073 //Exchange immediate after register. 00074 *it_op = mem; 00075 00076 //Try to find compatible tm_instr version that is compatible with this operand. 00077 if ( find_compatible_version(ge) ) { 00078 //Compatible version exists and it has been set to the ge_pi. 00079 //Remove dependence on the origin of the register (load of immediate). 00080 ge->dependencies_get()->erase(reg->origin_get()); 00081 00082 //Restart search for exchangeable operans. 00083 it_op = operands->begin(); 00084 } else { 00085 //Restore operands. 00086 *it_op = reg; 00087 ++it_op; 00088 } 00089 } 00090 } 00091 } 00092 }
| ptr< func_data > lestes::backend_v2::workers::memory_inliner::get_result | ( | ) | [virtual] |
Returns data of the currently processed function with immediates inlined whereever possible.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 119 of file memory_inliner.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00119 { 00120 return data_get(); 00121 }
| bool lestes::backend_v2::workers::memory_inliner::find_compatible_version | ( | ptr< ::lestes::backend_v2::intercode::ge_pi > | ge | ) |
Referenced by process().
| ptr< memory_inliner > lestes::backend_v2::workers::memory_inliner::create | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [static] |
First generated factory method for class memory_inliner.
This factory method for class memory_inliner takes values of all fields as arguments.
Definition at line 28 of file memory_inliner.g.cc.
References memory_inliner().
00029 { 00030 return ptr< memory_inliner > ( new memory_inliner(a__worker_base__data) ); 00031 }
| ptr< object::reflection_list > lestes::backend_v2::workers::memory_inliner::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 41 of file memory_inliner.g.cc.
References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().
00042 { 00043 if (!reflection) { 00044 typedef class_reflection::field_metadata md; 00045 typedef class_reflection::field_metadata_list mdlist; 00046 ptr<mdlist> mdl = mdlist::create(); 00047 reflection = reflection_list::create( worker_base::reflection_get() ); 00048 reflection->push_back( class_reflection::create( "memory_inliner", mdl ) ); 00049 } 00050 return reflection; 00051 }
| ptr< object::field_list_list > lestes::backend_v2::workers::memory_inliner::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 53 of file memory_inliner.g.cc.
References lestes::backend_v2::workers::worker_base::field_values_get().
00054 { 00055 ptr < field_list_list > result = worker_base::field_values_get(); 00056 return result; 00057 }
| void lestes::backend_v2::workers::memory_inliner::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class memory_inliner.
Marking routine is used for garbage collection.
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 64 of file memory_inliner.g.cc.
References lestes::backend_v2::workers::worker_base::gc_mark().
00065 { 00066 worker_base::gc_mark(); 00067 }
ptr< object::reflection_list > lestes::backend_v2::workers::memory_inliner::reflection = reflection [static, private] |
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 69 of file memory_inliner.g.hh.
Referenced by reflection_get().
1.5.1-20070107