00001
00002
00003
00004
00005
00006
00007 #include <lestes/md/types/copy_constructor_call_generator_base.g.hh>
00008 #include <lestes/md/types/tm_data_type_base.g.hh>
00009 #include <lestes/backend_v2/intercode/pi.g.hh>
00010
00011 package(lestes);
00012 package(md);
00013 package(types);
00014
00015 using ::lestes::md::types::tm_data_type_base;
00016 using namespace ::lestes::backend_v2::intercode;
00017
00018 typedef list<srp<pi_pi> > pi_list;
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 ptr<pi_list> copy_constructor_call_generator_base::generate(ptr< pi_mem > into, ptr< pi_operand > from, ptr<pi_sp> psp, ptr<pi_sp> nsp)
00033 {
00034 ptr<pi_list> copy_pis = pi_list::create();
00035
00036 switch (from->type_get()->kind_get()) {
00037 case tm_data_type_base::UNION: {
00038 lassert2(false,"Not implemented.");
00039 } break;
00040
00041 case tm_data_type_base::SIMPLE: {
00042 lassert(from->kind_get()!=pi_operand::LIT);
00043
00044
00045
00046
00047
00048
00049 ulint level = (psp->level_get() > nsp->level_get() ? psp->level_get() : nsp->level_get());
00050
00051 if ( from->origin_get() ) {
00052 level = level > from->origin_get()->level_get() ? level : from->origin_get()->level_get();
00053 }
00054
00055 level++;
00056
00057 if ( from->kind_get()!=pi_operand::PREG && from->kind_get()!=pi_operand::MEM_PREG ) {
00058
00059
00060
00061
00062
00063 ptr<pi_preg> tmp = pi_preg::create(NULL,from->type_get());
00064
00065
00066 ptr<pi_ld> ld = pi_ld::create(psp, nsp, level, tmp, from, from->type_get());
00067 tmp->origin_set(ld);
00068 copy_pis->push_back(ld);
00069
00070
00071 from = tmp;
00072 }
00073
00074
00075 ptr<pi_st> st = pi_st::create(psp, nsp, level, into, from, from->type_get());
00076 into->origin_set(st);
00077 copy_pis->push_back(st);
00078 } break;
00079
00080 case tm_data_type_base::STRUCT: {
00081 lassert2(false,"Not implemented.");
00082 } break;
00083
00084 default: lassert(false);
00085 }
00086
00087 return copy_pis;
00088 }
00089
00090
00091 end_package(types);
00092 end_package(md);
00093 end_package(lestes);
00094