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
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
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
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
00080
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
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
00106
00107 ptr<func_data> ge_generator::get_result() {
00108 return data_get();
00109 }
00110
00111
00112
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