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