lestes::backend_v2::workers::simple_spillgen Class Reference

Performs second pass spill-code generation. More...

#include <simple_spillgen.g.hh>

Inheritance diagram for lestes::backend_v2::workers::simple_spillgen:

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

Public Member Functions

void process ()
 Performs spill-code generation.
ptr< ::lestes::backend_v2::structs::func_dataget_result ()
 Returns data of the processed function with spill-code included.
ptr< ::lestes::backend_v2::intercode::pi_mem_factoryget_free_spill_place (ptr< list< srp< ::lestes::backend_v2::intercode::pi_mem_factory > > > mfs, ptr< ::lestes::md::types::tm_data_type_base > type)
ptr< ::lestes::md::registers::tm_registerpick_reg_by_data_type (ptr< set< ulint > > reg_set, ulint type_id)
void set_instruction_property (ptr< vector< srp< ::lestes::backend_v2::intercode::ge_pi > > > instrs, ulint property_id, lstring property_value)
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< simple_spillgencreate (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 First generated factory method for class simple_spillgen.

Protected Member Functions

 simple_spillgen (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 Generated constructor for class simple_spillgen.
virtual void gc_mark ()
 Marking routine for class simple_spillgen.

Static Private Attributes

static ptr< reflection_listreflection = reflection

Detailed Description

Performs second pass spill-code generation.

It generates spill-code for register operands generated by the first pass of spill-code generation.

Definition at line 61 of file simple_spillgen.g.hh.


Constructor & Destructor Documentation

lestes::backend_v2::workers::simple_spillgen::simple_spillgen ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [protected]

Generated constructor for class simple_spillgen.

Generated constructor for class simple_spillgen.

Author:
lsg

Definition at line 40 of file simple_spillgen.g.cc.

Referenced by create().

00041         : worker_base(a__worker_base__data)
00042 {}


Member Function Documentation

void lestes::backend_v2::workers::simple_spillgen::process (  )  [virtual]

Performs spill-code generation.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 39 of file simple_spillgen.cc.

References lestes::ui::code, lestes::backend_v2::workers::worker_base::data_get(), get_free_spill_place(), lassert, pick_reg_by_data_type(), and set_instruction_property().

00039                               {
00040 
00041         ptr<ge_pi_list__type> body = data_get()->ge_body_get();
00042         
00043         ptr<move_generator> move_gen = move_generator::create();
00044         
00045         ptr<mf_list__type> free_spill_places = mf_list__type::create();
00046         ptr<mf_list__type> spill_places_to_free = mf_list__type::create();
00047         ptr<op2mf__type> used_spill_places = op2mf__type::create();
00048         
00049         for(ge_pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) {
00050                 ptr<ge_pi> ge = *it;
00051                 ptr<tm_instr_base> tm = ge->instruction_get();
00052                 
00053                 if ( !tm ) {
00054                         continue;
00055                 }
00056                 
00057                 ge_pi_list__type::iterator it_next = it;
00058                 ++it_next;
00059                 
00060                 ulint i_pos = 0;
00061                 ptr<ge_operand_vector__type> operands = ge->operands_input_get();
00062                 for(ge_operand_vector__type::iterator it_op = operands->begin(); it_op!=operands->end(); ++it_op, ++i_pos) {
00063                         if ( (*it_op)->kind_get()!=ge_operand::REGISTER ) {
00064                                 continue;
00065                         }
00066                         
00067                         ptr<ge_operand_reg> op = (*it_op).dncast<ge_operand_reg>();
00068                         
00069                         if ( op->assigned_registers_get()->find(ge)!=op->assigned_registers_get()->end() ) {
00070                                 continue;
00071                         }
00072                         
00073                         ptr<tm_instr_op_reg_base> tmop = (*tm->operands_input_get())[i_pos].dncast<tm_instr_op_reg_base>();
00074                         ptr<tm_register> reg = pick_reg_by_data_type(tmop->allowed_registers_get(),op->type_get()->id_get());
00075                         
00076                         //Backup the register's value.
00077                         ptr<ge_operand_reg> backuped_reg = ge_operand_reg::create(op->type_get(),NULL,NULL);
00078                         ptr<pi_mem_factory> backup_place = get_free_spill_place(free_spill_places,op->type_get());
00079                         ptr<ge_operand_mem> backup_mem = backup_place->get_ge_mem(NULL);
00080                         ptr<ge_pi_vector__type> code = move_gen->generate_store_to_memory(backuped_reg,reg,backup_mem);
00081                         body->insert(it,code->begin(),code->end());
00082 
00083 #ifdef BACKEND_V2_DEBUG         
00084                         ::std::ostringstream oss1;
00085                         oss1 << "backup code (ge_pi=" << ge->uid_get() << ")";
00086                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss1.str());
00087 #endif
00088                         
00089                         //Load the spilled operand's value.
00090                         ptr<pi_mem_factory> spill_place = (*used_spill_places)[op];
00091                         lassert(spill_place);
00092                         ptr<ge_operand_mem> spill_mem = spill_place->get_ge_mem(NULL);
00093                         code = move_gen->generate_load_from_memory(spill_mem,op,reg);
00094                         body->insert(it,code->begin(),code->end());
00095 
00096 #ifdef BACKEND_V2_DEBUG         
00097                         ::std::ostringstream oss2;
00098                         oss2 << "load code (ge_pi=" << ge->uid_get() << ")";
00099                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss2.str());
00100 #endif
00101                         
00102                         //Restore the register's value.
00103                         code = move_gen->generate_load_from_memory(backup_mem,backuped_reg,reg);
00104                         body->insert(it_next,code->begin(),code->end());
00105 
00106 #ifdef BACKEND_V2_DEBUG         
00107                         ::std::ostringstream oss3;
00108                         oss3 << "restore code (ge_pi=" << ge->uid_get() << ")";
00109                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss3.str());
00110 #endif
00111                         
00112                         //Free spill places
00113                         spill_places_to_free->push_back(spill_place);
00114                         (*used_spill_places)[op] = NULL;
00115                         spill_places_to_free->push_back(backup_place);
00116                         
00117                         //Assign the register to the operand.
00118                         (*op->assigned_registers_get())[ge] = reg->id_get();
00119                 }
00120                 
00121                 i_pos = 0;
00122                 operands = ge->operands_output_get();
00123                 for(ge_operand_vector__type::iterator it_op = operands->begin(); it_op!=operands->end(); ++it_op, ++i_pos) {
00124                         if ( (*it_op)->kind_get()!=ge_operand::REGISTER ) {
00125                                 continue;
00126                         }
00127                         
00128                         ptr<ge_operand_reg> op = (*it_op).dncast<ge_operand_reg>();
00129                         
00130                         if ( op->assigned_registers_get()->find(ge)!=op->assigned_registers_get()->end() ) {
00131                                 continue;
00132                         }
00133                         
00134                         ptr<tm_instr_op_reg_base> tmop = (*tm->operands_output_get())[i_pos].dncast<tm_instr_op_reg_base>();
00135                         ptr<tm_register> reg = pick_reg_by_data_type(tmop->allowed_registers_get(),op->type_get()->id_get());
00136                         
00137                         //Backup the register's value.
00138                         ptr<ge_operand_reg> backuped_reg = ge_operand_reg::create(op->type_get(),NULL,NULL);
00139                         ptr<pi_mem_factory> backup_place = get_free_spill_place(free_spill_places,op->type_get());
00140                         ptr<ge_operand_mem> backup_mem = backup_place->get_ge_mem(NULL);
00141                         ptr<ge_pi_vector__type> code = move_gen->generate_store_to_memory(backuped_reg,reg,backup_mem);
00142                         body->insert(it,code->begin(),code->end());
00143 
00144 #ifdef BACKEND_V2_DEBUG         
00145                         ::std::ostringstream oss1;
00146                         oss1 << "backup code (ge_pi=" << ge->uid_get() << ")";
00147                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss1.str());
00148 #endif
00149                         
00150                         //Store the spilled operand's value.
00151                         ptr<pi_mem_factory> spill_place = get_free_spill_place(free_spill_places,op->type_get());
00152                         (*used_spill_places)[op] = spill_place;
00153                         ptr<ge_operand_mem> spill_mem = spill_place->get_ge_mem(NULL);
00154                         code = move_gen->generate_store_to_memory(op,reg,spill_mem);
00155                         body->insert(it_next,code->begin(),code->end());
00156 
00157 #ifdef BACKEND_V2_DEBUG         
00158                         ::std::ostringstream oss2;
00159                         oss2 << "store code (ge_pi=" << ge->uid_get() << ")";
00160                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss2.str());
00161 #endif
00162                         
00163                         //Restore the register's value.
00164                         code = move_gen->generate_load_from_memory(backup_mem,backuped_reg,reg);
00165                         body->insert(it_next,code->begin(),code->end());
00166 
00167 #ifdef BACKEND_V2_DEBUG         
00168                         ::std::ostringstream oss3;
00169                         oss3 << "restore code (ge_pi=" << ge->uid_get() << ")";
00170                         set_instruction_property(code,ge_pi::PROPERTY_SPILLGEN_INFO,oss3.str());
00171 #endif
00172                         
00173                         //Free spill places
00174                         spill_places_to_free->push_back(backup_place);
00175                         
00176                         //Assign the register to the operand.
00177                         (*op->assigned_registers_get())[ge] = reg->id_get();
00178                 }
00179         
00180                 free_spill_places->insert(free_spill_places->begin(),spill_places_to_free->begin(),spill_places_to_free->end());
00181                 spill_places_to_free->clear();
00182         }
00183                 
00184 }

ptr< func_data > lestes::backend_v2::workers::simple_spillgen::get_result (  )  [virtual]

Returns data of the processed function with spill-code included.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 252 of file simple_spillgen.cc.

References lestes::backend_v2::workers::worker_base::data_get().

00252                                            {
00253         return data_get();
00254 }

ptr< ::lestes::backend_v2::intercode::pi_mem_factory > lestes::backend_v2::workers::simple_spillgen::get_free_spill_place ( ptr< list< srp< ::lestes::backend_v2::intercode::pi_mem_factory > > >  mfs,
ptr< ::lestes::md::types::tm_data_type_base type 
)

Referenced by process().

ptr< ::lestes::md::registers::tm_register > lestes::backend_v2::workers::simple_spillgen::pick_reg_by_data_type ( ptr< set< ulint > >  reg_set,
ulint  type_id 
)

Referenced by process().

void lestes::backend_v2::workers::simple_spillgen::set_instruction_property ( ptr< vector< srp< ::lestes::backend_v2::intercode::ge_pi > > >  instrs,
ulint  property_id,
lstring  property_value 
)

Referenced by process().

ptr< simple_spillgen > lestes::backend_v2::workers::simple_spillgen::create ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [static]

First generated factory method for class simple_spillgen.

This factory method for class simple_spillgen takes values of all fields as arguments.

Author:
lsg

Definition at line 31 of file simple_spillgen.g.cc.

References simple_spillgen().

00032 {
00033         return ptr< simple_spillgen > ( new simple_spillgen(a__worker_base__data) );
00034 }

ptr< object::reflection_list > lestes::backend_v2::workers::simple_spillgen::reflection_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 44 of file simple_spillgen.g.cc.

References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().

00045 {
00046         if (!reflection) {
00047                 typedef class_reflection::field_metadata md;
00048                 typedef class_reflection::field_metadata_list mdlist;
00049                 ptr<mdlist> mdl = mdlist::create();
00050                 reflection = reflection_list::create( worker_base::reflection_get() );
00051                 reflection->push_back( class_reflection::create( "simple_spillgen", mdl ) );
00052         }
00053         return reflection;
00054 }

ptr< object::field_list_list > lestes::backend_v2::workers::simple_spillgen::field_values_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 56 of file simple_spillgen.g.cc.

References lestes::backend_v2::workers::worker_base::field_values_get().

00057 {
00058         ptr < field_list_list > result = worker_base::field_values_get();
00059         return result;
00060 }

void lestes::backend_v2::workers::simple_spillgen::gc_mark ( void   )  [protected, virtual]

Marking routine for class simple_spillgen.

Marking routine is used for garbage collection.

Author:
lsg

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 67 of file simple_spillgen.g.cc.

References lestes::backend_v2::workers::worker_base::gc_mark().

00068 {
00069         worker_base::gc_mark();
00070 }


Member Data Documentation

ptr< object::reflection_list > lestes::backend_v2::workers::simple_spillgen::reflection = reflection [static, private]

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 94 of file simple_spillgen.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