copy_constructor_call_generator_base.cc

Go to the documentation of this file.
00001 /*!
00002         \file
00003         \brief Generator of copy-constructor call.
00004         \author jaz
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         \brief Generates list of pseudoinstructions that copies operand to memory.
00023 
00024         Note: types of both parameters have to be the same.
00025         
00026         \param preg A memory destination.
00027         \param lit A literal source.
00028         \param psp A first boundary sequencepoint.
00029         \param nsp A second boundary sequencepoint.
00030         \return A list of pseudoinstructions.
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                                 Simple datatype. It is copied by pseudoinstructions. 
00046                         */
00047                         
00048                         //Compute level = max(psp->level,nsp->level,from->origin_get()->level)
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                                         Source operand is NOT register - it is mem. It has to be loaded to a register first.
00060                                 */
00061                                 
00062                                 // Create tmp register.
00063                                 ptr<pi_preg> tmp = pi_preg::create(NULL,from->type_get());
00064                                 
00065                                 //Load data from memory to the tmp register.
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                                 //Set tmp register as source operand.
00071                                 from = tmp;
00072                         }
00073                         
00074                         //Copy source operand (register) to the destination operand (memory).
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 

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