00001 /*! 00002 \file 00003 \brief Base for visitor returning tm_pi corresponding to a pi_pi. 00004 \author jaz 00005 */ 00006 00007 #include <lestes/backend_v2/intercode/ge.g.hh> 00008 #include <lestes/backend_v2/intercode/pi.g.hh> 00009 #include <lestes/md/instructions/pi_operand2ge_operand_base.g.hh> 00010 00011 package(lestes); 00012 package(md); 00013 package(instructions); 00014 00015 using namespace ::lestes::backend_v2::intercode; 00016 00017 typedef map< srp<pi_operand>, srp<ge_operand> > pi_op2ge_op__type; 00018 00019 /*! 00020 \brief Converts pi_operand to ge_operand. 00021 00022 It caches results of previous conversion. So if conversion of an already converted pi_operand instance is requested, 00023 the function returns the same instance of ge_operand class as the last time. 00024 00025 \param pi A pi_operand instance. 00026 \return A ge_operand instance. 00027 */ 00028 ptr< ::lestes::backend_v2::intercode::ge_operand > pi_operand2ge_operand_base::convert(ptr< ::lestes::backend_v2::intercode::pi_operand > pi) { 00029 ptr<ge_operand> ge; 00030 00031 //Has pi-operand been converted to ge-operand? 00032 pi_op2ge_op__type::iterator it_ge_op = pi_op2ge_op->find(pi); 00033 00034 if ( it_ge_op==pi_op2ge_op->end() ) { 00035 //No, it hasn't. Convert it. 00036 ge = pi->accept_visitor_pi_operand2ge_operand_gen_base(this); 00037 pi_op2ge_op->insert(::std::pair<srp<pi_operand>,srp<ge_operand> >(pi, ge)); 00038 } else { 00039 //Yes, it has. Use the already converted result. 00040 ge = it_ge_op->second; 00041 } 00042 00043 return ge; 00044 } 00045 00046 end_package(instructions); 00047 end_package(md); 00048 end_package(lestes); 00049
1.5.1-20070107