lestes::backend_v2::workers::memory_inliner Class Reference

Performs inlining of memory operands. More...

#include <memory_inliner.g.hh>

Inheritance diagram for lestes::backend_v2::workers::memory_inliner:

lestes::backend_v2::workers::worker_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

void process ()
 Performs inlining of memory operands.
ptr< ::lestes::backend_v2::structs::func_dataget_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_listreflection_get () const
 for purposes of dumping
virtual ptr< field_list_listfield_values_get () const
 for purposes of dumping

Static Public Member Functions

static ptr< memory_inlinercreate (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_listreflection = reflection

Detailed Description

Performs inlining of memory operands.

Definition at line 40 of file memory_inliner.g.hh.


Constructor & Destructor Documentation

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.

Author:
lsg

Definition at line 37 of file memory_inliner.g.cc.

Referenced by create().

00038         : worker_base(a__worker_base__data)
00039 {}


Member Function Documentation

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:24:11 2007 for lestes by doxygen 1.5.1-20070107