preasmgen_body_changes.cc

Go to the documentation of this file.
00001 #include <lestes/backend_v2/intercode/ge.g.hh>
00002 #include <lestes/backend_v2/intercode/pi.g.hh>
00003 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00004 #include <lestes/md/functions/preasmgen_body_changes.g.hh>
00005 #include <lestes/md/registers/tm_register.g.hh>
00006 #include <lestes/md/types/tm_data_type.g.hh>
00007 #include <lestes/md/instructions/tm_instr.g.hh>
00008 #include <lestes/md/literals/literal_info.g.hh>
00009 #include <lestes/md/mem/memory_allocators.g.hh>
00010 #include <sstream>
00011 #include <lestes/std/ucn_string.hh>
00012 
00013 package(lestes);
00014 package(md);
00015 package(functions);
00016 
00017 using namespace ::lestes::backend_v2::intercode;
00018 using namespace ::lestes::md::registers;
00019 using namespace ::lestes::md::types;
00020 using namespace ::lestes::md::instructions;
00021 using namespace ::lestes::md::literals;
00022 using namespace ::lestes::md::mem;
00023 using ::lestes::lang::cplus::sem::ss_function_declaration;
00024 
00025 typedef list<srp<ge_pi> > ge_pi_list__type;
00026 
00027 void preasmgen_body_changes::process_body() {
00028         ptr<ge_pi> psp = ge_sp::create(NULL, NULL);
00029         ptr<ge_pi> nsp = body_get()->front().dncast<ge_sp>();
00030         
00031         ptr<tm_data_type_base> type_32u = tm_dt_simple::instance(DT_INT_32U);
00032         ptr<ge_operand_reg> reg_ebp = ge_operand_reg::create(type_32u,psp,NULL);
00033         ptr<ge_operand_reg> reg_esp = ge_operand_reg::create(type_32u,psp,NULL);
00034         
00035         //PUSH EBP
00036         ptr<ge_pi> push_ebp = ge_pi::create(tm_instr::instance(INSTRUCTION_PUSH__2),NULL);
00037         push_ebp->operands_input_get()->push_back(reg_esp);
00038         (*reg_esp->assigned_registers_get())[push_ebp] = R_ESP;
00039         push_ebp->operands_input_get()->push_back(reg_ebp);
00040         (*reg_ebp->assigned_registers_get())[push_ebp] = R_EBP;
00041         push_ebp->operands_output_get()->push_back(reg_esp);
00042         
00043         
00044         //MOV EBP,ESP
00045         ptr<ge_pi> mov_esp_to_ebp = ge_pi::create(tm_instr::instance(INSTRUCTION_BACKUPESP__1),NULL);
00046         mov_esp_to_ebp->operands_input_get()->push_back(reg_esp);
00047         (*reg_esp->assigned_registers_get())[mov_esp_to_ebp] = R_ESP;
00048         mov_esp_to_ebp->operands_output_get()->push_back(reg_ebp);
00049         (*reg_ebp->assigned_registers_get())[mov_esp_to_ebp] = R_EBP;
00050         
00051         ptr<local_variable_allocator> allocator = local_variable_allocator::instance(function_get());
00052         lint vars_size = allocator->local_end_offset_get();
00053         
00054         if (vars_size!=0) {
00055                 //ADD ESP, $VARS_SPACE_SIZE
00056                 ::std::ostringstream oss;
00057                 oss << vars_size/8;
00058         
00059                 ptr<li_simple> vars_size_value = li_simple::create(type_32u,ucn_string(oss.str().c_str()));
00060                 ptr<ge_operand> vars_size = ge_operand_imm::create(type_32u,NULL,NULL,vars_size_value);
00061         
00062                 ptr<ge_operand_reg> cond = ge_operand_reg::create(tm_dt_simple::instance(DT_COND),NULL,NULL);
00063         
00064                 ptr<ge_pi> add = ge_pi::create(tm_instr::instance(INSTRUCTION_ESPADD__1),NULL);
00065                 add->operands_input_get()->push_back(reg_esp);
00066                 (*reg_esp->assigned_registers_get())[add] = R_ESP;
00067                 add->operands_input_get()->push_back(vars_size);
00068                 add->operands_output_get()->push_back(reg_esp);
00069                 add->operands_output_get()->push_back(cond);
00070                 (*cond->assigned_registers_get())[add] = R_COND;
00071                 cond->origin_set(add);
00072                 
00073                 body_get()->push_front(add);
00074                 add->dependencies_get()->insert(mov_esp_to_ebp);
00075                 nsp->dependencies_get()->insert(add);
00076         }
00077         
00078         body_get()->push_front(mov_esp_to_ebp);
00079         mov_esp_to_ebp->dependencies_get()->insert(push_ebp);
00080         nsp->dependencies_get()->insert(mov_esp_to_ebp);
00081         
00082         body_get()->push_front(push_ebp);
00083         push_ebp->dependencies_get()->insert(psp);
00084         nsp->dependencies_get()->insert(push_ebp);
00085         
00086         body_get()->push_front(psp);
00087         nsp->dependencies_get()->insert(psp);
00088 }
00089 
00090 ptr<ge_pi_list__type> preasmgen_body_changes::get_result() {
00091         return body_get();
00092 }
00093 
00094 end_package(functions);
00095 end_package(md);
00096 end_package(lestes);
00097 

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