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
1.5.1-20070107