visitor_ge_operand2asm.cc

Go to the documentation of this file.
00001 /*!
00002         \file
00003         \author jaz
00004 */
00005 
00006 #include <lestes/backend_v2/intercode/ge.g.hh>
00007 #include <lestes/backend_v2/intercode/pi.g.hh>
00008 #include <lestes/backend_v2/intercode/pi_mem_factory.g.hh>
00009 #include <lestes/backend_v2/intercode/visitor_ge_operand2asm.g.hh>
00010 #include <lestes/md/registers/tm_register.g.hh>
00011 #include <lestes/md/types/tm_data_type.g.hh>
00012 #include <lestes/md/tasm/tm_asm.mdg.hh>
00013 #include <lestes/md/literals/literal_loader.g.hh>
00014 #include <lestes/md/symbols/name_mangler.g.hh>
00015 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00016 #include <sstream>
00017 
00018 package(lestes);
00019 package(backend_v2);
00020 package(intercode);
00021 
00022 using namespace ::lestes::md::instructions;
00023 using namespace ::lestes::md::registers;
00024 using namespace ::lestes::md::tasm;
00025 using namespace ::lestes::md::literals;
00026 using namespace ::lestes::md::symbols;
00027 using namespace ::lestes::md;
00028 
00029 typedef map< srp<ge_pi>, ulint> ge_pi2reg__type;
00030 
00031 lstring visitor_ge_operand2asm::visit_ge_operand_reg(ptr< ::lestes::backend_v2::intercode::ge_operand_reg > ge) {
00032         lstring code;   
00033         
00034         ge_pi2reg__type::iterator it = ge->assigned_registers_get()->find(instruction);
00035         
00036         if ( it!=ge->assigned_registers_get()->end() ) {
00037                 code = tm_register::instance((tm_register_base::id_type)it->second)->asm_output_get();
00038         } else {
00039                 ::std::ostringstream oss;
00040                 oss << ge->uid_get();
00041                 code = "!NO_REG(ge_operand_reg=" + oss.str() + ")";
00042         }
00043         
00044         return code;
00045 }
00046 
00047 lstring visitor_ge_operand2asm::visit_ge_operand_mem(ptr< ::lestes::backend_v2::intercode::ge_operand_mem > ge) {
00048         ptr<pi_mem_factory> factory = ge->factory_get();
00049         
00050         lstring code;
00051 
00052         switch (factory->kind_get()) {
00053                 case pi_mem_factory::MF_DECL: {
00054                         ptr<pi_mf_decl> mf = factory.dncast<pi_mf_decl>();
00055         
00056                         //Get id of the global declaration.
00057                         lstring id = name_mangler::instance()->mangle(mf->decl_get());
00058 
00059                         code = tm_asm::ent_global_mem_address_get();
00060                         code = string_replace(code, "$address", id);
00061                 } break;                
00062                 
00063                 case pi_mem_factory::MF_LIT: {
00064                         ptr<pi_lit> lit = factory.dncast<pi_mf_lit>()->lit_get();
00065         
00066                         ptr<literal_loader> loader = literal_loader::instance();
00067         
00068                         //Get id of literal.
00069                         lstring id = loader->get_id_for_managed_literal(lit);
00070                         lassert(!id.empty());   
00071         
00072                         code = tm_asm::ent_global_mem_address_get();
00073                         code = string_replace(code, "$address", id);
00074                 } break;                
00075                 
00076                 case pi_mem_factory::MF_STACK: {
00077                         ptr<pi_mf_stack> mf =factory.dncast<pi_mf_stack>();
00078         
00079                         //Get stack offset.
00080                         t_ssize offset = mf->offset_get();
00081                         lassert(!(offset%32));
00082         
00083                         code = tm_asm::ent_stack_address_get();
00084         
00085                         ::std::ostringstream oss;
00086                         if ( offset >= 0 ) {
00087                                 oss << "+";
00088                         }
00089         
00090                         oss << offset/8;
00091         
00092                         code = string_replace(code, "$offset", oss.str());
00093                 } break;
00094                         
00095                 case pi_mem_factory::MF_PTR_DEREF: {
00096                         ptr<pi_mf_ptr_deref> mf = factory.dncast<pi_mf_ptr_deref>();
00097         
00098                         //Get id of register holding address to be dereferenced.
00099                         lstring reg_id = mf->ge_addr_get()->accept_visitor_ge_operand2lstring_gen_base(this);
00100 
00101                         code = reg_id;
00102                 } break;
00103                 
00104                 default: lassert(false);                                                                        
00105         }
00106         
00107         return  " [" + code + "]";
00108 }
00109 
00110 lstring visitor_ge_operand2asm::visit_ge_operand_imm(ptr< ::lestes::backend_v2::intercode::ge_operand_imm > ge) {
00111         return ge->value_get()->get_asm_definition_val();
00112 }
00113 
00114 
00115 end_package(intercode);
00116 end_package(backend_v2);
00117 end_package(lestes);
00118 

Generated on Mon Feb 12 18:23:44 2007 for lestes by doxygen 1.5.1-20070107