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

Public Member Functions | |
| void | process () |
| Performs immediate inlining. | |
| 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< literal_inliner > | create (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) |
| First generated factory method for class literal_inliner. | |
Protected Member Functions | |
| literal_inliner (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) | |
| Generated constructor for class literal_inliner. | |
| virtual void | gc_mark () |
| Marking routine for class literal_inliner. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
Definition at line 40 of file literal_inliner.g.hh.
| lestes::backend_v2::workers::literal_inliner::literal_inliner | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [protected] |
Generated constructor for class literal_inliner.
Generated constructor for class literal_inliner.
Definition at line 37 of file literal_inliner.g.cc.
Referenced by create().
00038 : worker_base(a__worker_base__data) 00039 {}
| void lestes::backend_v2::workers::literal_inliner::process | ( | ) | [virtual] |
Performs immediate inlining.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 27 of file literal_inliner.cc.
References lestes::backend_v2::workers::worker_base::data_get(), and find_compatible_version().
00027 { 00028 00029 ptr<reg2imm__type> reg2imm = reg2imm__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::IMMEDIATE 00043 && ge->operands_output_get()->front()->kind_get()==ge_operand::REGISTER ) { 00044 //The instruction is load instruction that loads an immediate to register. 00045 (*reg2imm)[ge->operands_output_get()->front().dncast<ge_operand_reg>()] = ge->operands_input_get()->front().dncast<ge_operand_imm>(); 00046 } else if ( tm->versions_get() ) { 00047 //The instruction has exchangeable tm_instr version available. 00048 //Go through input operands and search for a register operand that can be echanged for its immediate source. 00049 ptr<ge_op_vector__type> operands = ge->operands_input_get(); 00050 for(ge_op_vector__type::iterator it_op = operands->begin(); it_op!=operands->end();) { 00051 if ( (*it_op)->kind_get()!=ge_operand::REGISTER ) { 00052 ++it_op; 00053 continue; 00054 } 00055 00056 ptr<ge_operand_reg> reg = (*it_op).dncast<ge_operand_reg>(); 00057 00058 reg2imm__type::iterator it_imm = reg2imm->find(reg); 00059 00060 if ( it_imm==reg2imm->end() ) { 00061 ++it_op; 00062 continue; 00063 } 00064 00065 //Ok, the immediate source has been found. 00066 ptr<ge_operand_imm> imm = it_imm->second; 00067 00068 //Exchange immediate after register. 00069 *it_op = imm; 00070 00071 //Try to find compatible tm_instr version that is compatible with this operand. 00072 if ( find_compatible_version(ge) ) { 00073 //Compatible version exists and it has been set to the ge_pi. 00074 //Remove dependence on the origin of the register (load of immediate). 00075 ge->dependencies_get()->erase(reg->origin_get()); 00076 00077 //Restart search for exchangeable operans. 00078 it_op = operands->begin(); 00079 } else { 00080 //Restore operands. 00081 *it_op = reg; 00082 ++it_op; 00083 } 00084 } 00085 } 00086 } 00087 }
| ptr< func_data > lestes::backend_v2::workers::literal_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 114 of file literal_inliner.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00114 { 00115 return data_get(); 00116 }
| bool lestes::backend_v2::workers::literal_inliner::find_compatible_version | ( | ptr< ::lestes::backend_v2::intercode::ge_pi > | ge | ) |
Referenced by process().
| ptr< literal_inliner > lestes::backend_v2::workers::literal_inliner::create | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [static] |
First generated factory method for class literal_inliner.
This factory method for class literal_inliner takes values of all fields as arguments.
Definition at line 28 of file literal_inliner.g.cc.
References literal_inliner().
00029 { 00030 return ptr< literal_inliner > ( new literal_inliner(a__worker_base__data) ); 00031 }
| ptr< object::reflection_list > lestes::backend_v2::workers::literal_inliner::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 41 of file literal_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( "literal_inliner", mdl ) ); 00049 } 00050 return reflection; 00051 }
| ptr< object::field_list_list > lestes::backend_v2::workers::literal_inliner::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 53 of file literal_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::literal_inliner::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class literal_inliner.
Marking routine is used for garbage collection.
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 64 of file literal_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::literal_inliner::reflection = reflection [static, private] |
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 69 of file literal_inliner.g.hh.
Referenced by reflection_get().
1.5.1-20070107