00001
00002
00003
00004
00005
00006
00007
00008 #ifndef lestes__md__registers__move_generator_g_hh__included
00009 #define lestes__md__registers__move_generator_g_hh__included
00010
00011 #include <lestes/std/list.hh>
00012 #include <lestes/std/set.hh>
00013 #include <lestes/md/common.hh>
00014
00015 #include <lestes/std/objectize_macros.hh>
00016 package(lestes);
00017 package(backend_v2);
00018 package(intercode);
00019 class ge_operand;
00020 end_package(intercode);
00021 end_package(backend_v2);
00022 end_package(lestes);
00023
00024 package(lestes);
00025 package(backend_v2);
00026 package(intercode);
00027 class ge_operand_mem;
00028 end_package(intercode);
00029 end_package(backend_v2);
00030 end_package(lestes);
00031
00032 package(lestes);
00033 package(backend_v2);
00034 package(intercode);
00035 class ge_operand_reg;
00036 end_package(intercode);
00037 end_package(backend_v2);
00038 end_package(lestes);
00039
00040 package(lestes);
00041 package(backend_v2);
00042 package(intercode);
00043 class ge_pi;
00044 end_package(intercode);
00045 end_package(backend_v2);
00046 end_package(lestes);
00047
00048 package(lestes);
00049 package(md);
00050 package(instructions);
00051 class pi_pi2ge_pi_template_base;
00052 end_package(instructions);
00053 end_package(md);
00054 end_package(lestes);
00055
00056 package(lestes);
00057 package(md);
00058 package(instructions);
00059 class instruction_group_base;
00060 end_package(instructions);
00061 end_package(md);
00062 end_package(lestes);
00063
00064 package(lestes);
00065 package(md);
00066 package(instructions);
00067 class tm_instr_base;
00068 end_package(instructions);
00069 end_package(md);
00070 end_package(lestes);
00071
00072 package(lestes);
00073 package(md);
00074 package(instructions);
00075 class tm_instr_op_base;
00076 end_package(instructions);
00077 end_package(md);
00078 end_package(lestes);
00079
00080 package(lestes);
00081 package(md);
00082 package(registers);
00083 class tm_register_base;
00084 end_package(registers);
00085 end_package(md);
00086 end_package(lestes);
00087
00088 package(lestes);
00089 package(md);
00090 package(registers);
00091
00092
00093 class move_generator;
00094
00095
00096
00097
00098
00099
00100 class move_generator : public ::lestes::std::object {
00101 public:
00102 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > generate_load_from_memory(ptr< ::lestes::backend_v2::intercode::ge_operand_mem > op_mem, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op_reg, ptr< ::lestes::md::registers::tm_register_base > reg);
00103
00104 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > generate_store_to_memory(ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op_reg, ptr< ::lestes::md::registers::tm_register_base > reg, ptr< ::lestes::backend_v2::intercode::ge_operand_mem > op_mem);
00105
00106 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > generate_copy_to_register(ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op_reg_src, ptr< ::lestes::md::registers::tm_register_base > reg_src, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op_reg_dst, ptr< ::lestes::md::registers::tm_register_base > reg_dst);
00107
00108 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > generate_move(ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_src, ptr< ::lestes::md::registers::tm_register_base > reg_src, ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_dst, ptr< ::lestes::md::registers::tm_register_base > reg_dst);
00109
00110 ptr< vector< srp< ::lestes::backend_v2::intercode::ge_pi> > > generate_ge_code(ptr< ::lestes::backend_v2::intercode::ge_operand > input_op, ptr< ::lestes::md::registers::tm_register_base > input_reg, ptr< ::lestes::backend_v2::intercode::ge_operand > output_op, ptr< ::lestes::md::registers::tm_register_base > output_reg, ptr< ::lestes::md::instructions::pi_pi2ge_pi_template_base > pat, ptr< vector< ulint > > selected_instrs, ptr< map< ulint, ulint > > selected_op_types);
00111
00112 bool find_consistent_instructions(ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_src, ptr< ::lestes::md::registers::tm_register_base > reg_src, ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_dst, ptr< ::lestes::md::registers::tm_register_base > reg_dst, ptr< ::lestes::md::instructions::pi_pi2ge_pi_template_base > pat, ptr< vector< ulint > > selected_instrs, ptr< map< ulint, srp< ::lestes::md::instructions::tm_instr_op_base > > > selected_operands, ptr< map< ulint, ulint > > selected_op_types, ulint curr_instrs_pat);
00113
00114 bool is_instruction_consistent(ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_src, ptr< ::lestes::md::registers::tm_register_base > reg_src, ptr< ::lestes::backend_v2::intercode::ge_operand > op_reg_dst, ptr< ::lestes::md::registers::tm_register_base > reg_dst, ptr< ::lestes::md::instructions::instruction_group_base > instr_pat, ptr< ::lestes::md::instructions::tm_instr_base > instr_version, ptr< map< ulint, srp< ::lestes::md::instructions::tm_instr_op_base > > > selected_operands, ptr< map< ulint, ulint > > selected_op_types);
00115
00116 bool is_operand_compatible1(ptr< ::lestes::md::instructions::tm_instr_op_base > instr_op, ptr< ::lestes::backend_v2::intercode::ge_operand > ge_op, ulint type, ptr< ::lestes::md::registers::tm_register_base > reg);
00117
00118 bool is_operand_compatible2(ptr< ::lestes::md::instructions::tm_instr_op_base > op1, ptr< ::lestes::md::instructions::tm_instr_op_base > op2, ulint type);
00119
00120 void add_selected_operands(ptr< ::lestes::backend_v2::intercode::ge_operand > input_op, ptr< ::lestes::backend_v2::intercode::ge_operand > output_op, ptr< ::lestes::md::instructions::instruction_group_base > instr_pat, ptr< ::lestes::md::instructions::tm_instr_base > instr_version, ptr< map< ulint, srp< ::lestes::md::instructions::tm_instr_op_base > > > selected_operands, ptr< map< ulint, ulint > > selected_op_types);
00121
00122 void remove_selected_operands(ptr< ::lestes::md::instructions::instruction_group_base > instr_pat, ptr< map< ulint, srp< ::lestes::md::instructions::tm_instr_op_base > > > selected_operands, ptr< map< ulint, ulint > > selected_op_types);
00123
00124 ptr< ::lestes::md::instructions::tm_instr_op_base > find_op_by_id(ptr< ::lestes::std::vector< srp< ::lestes::md::instructions::tm_instr_op_base> > > list, ulint id);
00125
00126
00127
00128 static ptr< move_generator > create (
00129 );
00130
00131
00132
00133
00134 virtual ptr<reflection_list> reflection_get() const;
00135
00136 virtual ptr<field_list_list> field_values_get() const;
00137
00138 protected:
00139
00140 move_generator (
00141 );
00142
00143
00144 virtual void gc_mark();
00145
00146 private:
00147 static ptr<reflection_list> reflection;
00148
00149 };
00150
00151
00152 end_package(registers);
00153 end_package(md);
00154 end_package(lestes);
00155
00156 #endif // lestes__md__registers__move_generator_g_hh__included