lestes::backend_v2::workers::literal_inliner Class Reference

Provides immediate inlining. More...

#include <literal_inliner.g.hh>

Inheritance diagram for lestes::backend_v2::workers::literal_inliner:

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

Public Member Functions

void process ()
 Performs immediate inlining.
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< literal_inlinercreate (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_listreflection = reflection

Detailed Description

Provides immediate inlining.

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


Constructor & Destructor Documentation

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.

Author:
lsg

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

Referenced by create().

00038         : worker_base(a__worker_base__data)
00039 {}


Member Function Documentation

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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


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