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

Public Member Functions | |
| void | process () |
| Performs spill-code generation. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_result () |
| Returns data of the processed function with spill-code included. | |
| ptr< ::lestes::backend_v2::intercode::pi_mem_factory > | get_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_register > | pick_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_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< simple_spillgen > | create (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_list > | reflection = reflection |
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.
| 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.
Definition at line 40 of file simple_spillgen.g.cc.
Referenced by create().
00041 : worker_base(a__worker_base__data) 00042 {}
| 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.
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.
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 }
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().
1.5.1-20070107