00001
00002
00003
00004
00005
00006
00007
00008 #ifndef lestes__backend_v2__workers__linscan_regalloc_g_hh__included
00009 #define lestes__backend_v2__workers__linscan_regalloc_g_hh__included
00010
00011 #include <lestes/std/list.hh>
00012 #include <lestes/std/set.hh>
00013 #include <lestes/backend_v2/common.hh>
00014 #include <lestes/backend_v2/workers/worker_base.g.hh>
00015
00016 #include <lestes/std/objectize_macros.hh>
00017 package(lestes);
00018 package(backend_v2);
00019 package(structs);
00020 class func_data;
00021 end_package(structs);
00022 end_package(backend_v2);
00023 end_package(lestes);
00024
00025 package(lestes);
00026 package(backend_v2);
00027 package(intercode);
00028 class ge_pi;
00029 end_package(intercode);
00030 end_package(backend_v2);
00031 end_package(lestes);
00032
00033 package(lestes);
00034 package(backend_v2);
00035 package(intercode);
00036 class ge_operand_mem;
00037 end_package(intercode);
00038 end_package(backend_v2);
00039 end_package(lestes);
00040
00041 package(lestes);
00042 package(backend_v2);
00043 package(intercode);
00044 class ge_operand_reg;
00045 end_package(intercode);
00046 end_package(backend_v2);
00047 end_package(lestes);
00048
00049 package(lestes);
00050 package(backend_v2);
00051 package(workers);
00052 class alloc_interval;
00053 end_package(workers);
00054 end_package(backend_v2);
00055 end_package(lestes);
00056
00057 package(lestes);
00058 package(md);
00059 package(instructions);
00060 class tm_instr_op_reg_base;
00061 end_package(instructions);
00062 end_package(md);
00063 end_package(lestes);
00064
00065 package(lestes);
00066 package(md);
00067 package(registers);
00068 class tm_register;
00069 end_package(registers);
00070 end_package(md);
00071 end_package(lestes);
00072
00073 package(lestes);
00074 package(backend_v2);
00075 package(workers);
00076
00077
00078 class linscan_regalloc;
00079
00080
00081
00082 class linscan_regalloc : public worker_base {
00083 public:
00084
00085 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > active_intervals_get() const;
00086
00087
00088 void active_intervals_set(const ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > & );
00089
00090
00091 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > expired_intervals_get() const;
00092
00093
00094 void expired_intervals_set(const ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > & );
00095
00096
00097 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > waiting_intervals_get() const;
00098
00099
00100 void waiting_intervals_set(const ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > & );
00101
00102
00103 ptr< ::lestes::std::map< ulint, srp< ::lestes::backend_v2::workers::alloc_interval > > > register_owners_get() const;
00104
00105
00106 void register_owners_set(const ptr< ::lestes::std::map< ulint, srp< ::lestes::backend_v2::workers::alloc_interval > > > & );
00107
00108
00109 ptr< ::lestes::std::set< ulint > > free_registers_get() const;
00110
00111
00112 void free_registers_set(const ptr< ::lestes::std::set< ulint > > & );
00113
00114
00115 ptr< ::lestes::std::set< ulint > > used_registers_get() const;
00116
00117
00118 void used_registers_set(const ptr< ::lestes::std::set< ulint > > & );
00119
00120
00121 ptr< ::lestes::std::set< ulint > > all_registers_get() const;
00122
00123
00124 void all_registers_set(const ptr< ::lestes::std::set< ulint > > & );
00125
00126
00127 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_operand_reg >, srp< ::lestes::md::registers::tm_register > > > destroyers_get() const;
00128
00129
00130 void destroyers_set(const ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_operand_reg >, srp< ::lestes::md::registers::tm_register > > > & );
00131
00132 void process();
00133
00134 ptr< ::lestes::backend_v2::structs::func_data > get_result();
00135
00136 ptr<set<ulint> > ge_pi__get_allowed_regs_for_op(ptr< ::lestes::backend_v2::intercode::ge_pi > ge, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op);
00137
00138 ptr< ::lestes::md::instructions::tm_instr_op_reg_base > ge_pi__find_tm_op_by_ge_op(ptr< ::lestes::backend_v2::intercode::ge_pi > ge, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op);
00139
00140 ptr< ::lestes::md::registers::tm_register > get_free_register(ptr< ::lestes::backend_v2::workers::alloc_interval > interval);
00141
00142 void set_register_owner(ptr< ::lestes::md::registers::tm_register > reg, ptr< ::lestes::backend_v2::workers::alloc_interval > interval);
00143
00144 void expire_old_intervals(ptr< ::lestes::backend_v2::workers::alloc_interval > curr_interval);
00145
00146 void setup_registers();
00147
00148 void find_free_registers();
00149
00150 void set_registers_to_operands();
00151
00152 void set_interval_dependencies();
00153
00154 ptr< ::lestes::md::registers::tm_register > get_destroyed_register(ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op);
00155
00156 void set_destroyed_register(ptr< ::lestes::backend_v2::intercode::ge_pi > ge, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op, ptr< ::lestes::md::registers::tm_register > reg);
00157
00158
00159
00160 static ptr< linscan_regalloc > create (
00161 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data,
00162 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__active_intervals,
00163 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__expired_intervals,
00164 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__waiting_intervals,
00165 ptr< ::lestes::std::map< ulint, srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__register_owners,
00166 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__free_registers,
00167 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__used_registers,
00168 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__all_registers,
00169 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_operand_reg >, srp< ::lestes::md::registers::tm_register > > > a__linscan_regalloc__destroyers);
00170
00171
00172 static ptr< linscan_regalloc > create (
00173 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data);
00174
00175
00176
00177
00178 virtual ptr<reflection_list> reflection_get() const;
00179
00180 virtual ptr<field_list_list> field_values_get() const;
00181
00182 protected:
00183
00184 linscan_regalloc (
00185 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data,
00186 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__active_intervals,
00187 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__expired_intervals,
00188 ptr< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__waiting_intervals,
00189 ptr< ::lestes::std::map< ulint, srp< ::lestes::backend_v2::workers::alloc_interval > > > a__linscan_regalloc__register_owners,
00190 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__free_registers,
00191 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__used_registers,
00192 ptr< ::lestes::std::set< ulint > > a__linscan_regalloc__all_registers,
00193 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_operand_reg >, srp< ::lestes::md::registers::tm_register > > > a__linscan_regalloc__destroyers);
00194
00195
00196 virtual void gc_mark();
00197
00198 private:
00199
00200 srp< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > active_intervals;
00201
00202 srp< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > expired_intervals;
00203
00204 srp< ::lestes::std::vector< srp< ::lestes::backend_v2::workers::alloc_interval > > > waiting_intervals;
00205
00206 srp< ::lestes::std::map< ulint, srp< ::lestes::backend_v2::workers::alloc_interval > > > register_owners;
00207
00208 srp< ::lestes::std::set< ulint > > free_registers;
00209
00210 srp< ::lestes::std::set< ulint > > used_registers;
00211
00212 srp< ::lestes::std::set< ulint > > all_registers;
00213
00214 srp< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_operand_reg >, srp< ::lestes::md::registers::tm_register > > > destroyers;
00215 static ptr<reflection_list> reflection;
00216
00217 };
00218
00219
00220 end_package(workers);
00221 end_package(backend_v2);
00222 end_package(lestes);
00223
00224 #endif // lestes__backend_v2__workers__linscan_regalloc_g_hh__included