ge_generator.cc

Go to the documentation of this file.
00001 #include <lestes/backend_v2/structs/func_data.g.hh>
00002 #include <lestes/backend_v2/intercode/pi.g.hh>
00003 #include <lestes/backend_v2/intercode/ge.g.hh>
00004 #include <lestes/backend_v2/intercode/visitor_pi_pi2pi_operands.g.hh>
00005 #include <lestes/backend_v2/workers/ge_generator.g.hh>
00006 #include <lestes/backend_v2/structs/pi_operands.g.hh>
00007 #include <lestes/md/instructions/pi_pi2ge_pi.g.hh>
00008 #include <lestes/backend_v2/debug/debug.hh>
00009 
00010 package(lestes);
00011 package(backend_v2);
00012 package(workers);
00013 
00014 using namespace ::lestes::msg;
00015 using namespace ::lestes::backend_v2::structs;
00016 using namespace ::lestes::backend_v2::intercode;
00017 using namespace ::lestes::md::instructions;
00018 
00019 typedef list< srp<pi_pi> > pi_pi_list__type;
00020 typedef list< srp<pi_sp> > pi_sp_list__type;
00021 typedef list< srp<ge_pi> > ge_pi_list__type;
00022 typedef vector< srp<ge_pi> > ge_pi_vector__type;
00023 typedef vector< srp<pi_operand> > pi_operand_vector__type;
00024 typedef map< srp<pi_pi>, srp<vector<srp<ge_pi> > > > pi_pi2ge_pi_vector__type;
00025 typedef map< srp<pi_operand>, ulint > pi_op2count__type;
00026 
00027 declare_logger(log);
00028 initialize_logger( log, "ge_generator", backend_v2_logger );
00029 
00030 
00031 /*!
00032         \brief Generates ge-level intercode for a function body in pi-level intercode.
00033 */
00034 void ge_generator::process() {
00035         
00036         log << "ge-code generation - start\n" << eolog;
00037         
00038         
00039         ptr<visitor_pi_pi2pi_operands> pi2op = visitor_pi_pi2pi_operands::create();
00040         ptr<visitor_pi_pi2id> pi_id_getter = visitor_pi_pi2id::create();
00041                 
00042         ptr<pi_pi_list__type> pi_pi_list = data_get()->pi_body_get();
00043         ptr<ge_pi_list__type> ge_pi_list = data_get()->ge_body_get();
00044         
00045         //Count operand uses.
00046         ptr<pi_op2count__type> op_use_count = pi_op2count__type::create();
00047         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00048                 ptr<pi_pi> pi = *it_pi_list;
00049                 ptr<pi_operands> ops = pi->accept_visitor_pi_pi2pi_operands_gen_base(pi2op);
00050                 
00051                 ptr<pi_operand_vector__type> in_ops = ops->operands_input_get();
00052                 for(pi_operand_vector__type::iterator it_op = in_ops->begin(); it_op!=in_ops->end(); ++it_op) {
00053                         ptr<pi_operand> op = *it_op;
00054                         
00055                         pi_op2count__type::iterator it_search = op_use_count->find(op);
00056                         
00057                         if ( it_search==op_use_count->end() ) {
00058                                 (*op_use_count)[op] = 1;
00059                         } else {
00060                                 (*op_use_count)[op] = it_search->second + 1;
00061                         }
00062                 }
00063         }
00064         
00065         ptr<pi_pi2ge_pi> convertor = pi_pi2ge_pi::create(op_use_count);
00066         
00067         ptr<pi_pi2ge_pi_vector__type> pi2ge = pi_pi2ge_pi_vector__type::create();       
00068         //Convert sequencepoints
00069         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00070                 ptr<pi_pi> pi = *it_pi_list;
00071                 
00072                 if ( (visitor_pi_pi2id::kind_type)pi->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter)==visitor_pi_pi2id::PI_SP ) {
00073                         ptr<ge_pi_vector__type> ge_code = pi->accept_visitor_pi_pi2ge_pi_gen_base(convertor);
00074                         (*pi2ge)[pi] = ge_code;
00075                 }
00076         }
00077         
00078         /*
00079                 Convert pseudoinstructions.
00080                 Sequencepoints have to be converted before this.
00081         */
00082         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00083                 ptr<pi_pi> pi = *it_pi_list;
00084                 
00085                 ptr<ge_pi_vector__type> ge_code;
00086                 
00087                 if ( (visitor_pi_pi2id::kind_type)pi->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter)==visitor_pi_pi2id::PI_SP ) {
00088                         ge_code = (*pi2ge)[pi];
00089                 } else {
00090                         ge_code = pi->accept_visitor_pi_pi2ge_pi_gen_base(convertor);
00091                 }
00092                 
00093                 append_vector_to_list(ge_pi_list,ge_code);                              
00094         }
00095         
00096         //Setup dependencies of the ge-pseudoinstructions.
00097         for(ge_pi_list__type::iterator it_ge_list = ge_pi_list->begin(); it_ge_list!=ge_pi_list->end(); ++it_ge_list) {
00098                 convertor->setup_dependencies(*it_ge_list);
00099         }
00100         
00101         log << "ge-code generation - end\n" << eolog;
00102 }
00103 
00104 /*!
00105         \brief Returns the function's data with generated body in ge-intercode.
00106 */
00107 ptr<func_data> ge_generator::get_result() {
00108         return data_get();
00109 }
00110 
00111 /*!
00112         \brief Appends a vector to a list.
00113 */
00114 void ge_generator::append_vector_to_list(ptr<ge_pi_list__type> l, ptr<ge_pi_vector__type> v) {
00115         for(ulint i=0; i<v->size(); ++i) {
00116                 l->push_back((*v)[i]);
00117         }
00118 }
00119 
00120 end_package(workers);
00121 end_package(backend_v2);
00122 end_package(lestes);
00123 

Generated on Mon Feb 12 18:22:35 2007 for lestes by doxygen 1.5.1-20070107