00001
00002
00003
00004
00005
00006
00007
00008 #include <lestes/std/map.hh>
00009 #include <lestes/std/set.hh>
00010 #include <lestes/md/registers/tm_register.g.hh>
00011 #include <lestes/md/types/tm_data_type.g.hh>
00012 #include <lestes/md/instructions/pi_pi2ge_pi_template.g.hh>
00013
00014 package(lestes);
00015 package(md);
00016 package(registers);
00017
00018 using namespace ::lestes::md::types;
00019 using namespace ::lestes::md::instructions;
00020
00021 ptr<tm_register> tm_register::instance(tm_register_base::id_type id) {
00022 map<tm_register_base::id_type, srp<tm_register> >::iterator existing_reg = id_to_instance_get()->find(id);
00023
00024 if ( existing_reg != id_to_instance_get()->end() ) {
00025 return existing_reg->second;
00026 }
00027
00028 ptr<tm_register> new_reg = NULL;
00029 switch(id) {
00030 case R_UNDEFINED: lassert(false); break;
00031 case R_AL: {
00032 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00033 dt_list->insert(DT_INT_8P);
00034 dt_list->insert(DT_INT_8U);
00035 dt_list->insert(DT_INT_8S);
00036 dt_list->insert(DT_BOOL);
00037 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00038 reg_list->insert(R_AL);
00039 reg_list->insert(R_AX);
00040 reg_list->insert(R_EAX);
00041 ptr<set<ulint> > move_templates = set<ulint>::create();
00042 move_templates->insert(TEM_REGISTER_MOVE_1);
00043 new_reg = tm_register::create(R_AL, 8, dt_list, reg_list, move_templates, lstring("AL"),0);
00044 } break;
00045 case R_AH: {
00046 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00047 dt_list->insert(DT_INT_8P);
00048 dt_list->insert(DT_INT_8U);
00049 dt_list->insert(DT_INT_8S);
00050 dt_list->insert(DT_BOOL);
00051 dt_list->insert(DT_COND);
00052 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00053 reg_list->insert(R_AH);
00054 reg_list->insert(R_AX);
00055 reg_list->insert(R_EAX);
00056 ptr<set<ulint> > move_templates = set<ulint>::create();
00057 move_templates->insert(TEM_REGISTER_MOVE_1);
00058 new_reg = tm_register::create(R_AH, 8, dt_list, reg_list, move_templates, lstring("AH"),0);
00059 } break;
00060 case R_AX: {
00061 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00062 dt_list->insert(DT_INT_16U);
00063 dt_list->insert(DT_INT_16S);
00064 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00065 reg_list->insert(R_AX);
00066 reg_list->insert(R_AH);
00067 reg_list->insert(R_AL);
00068 reg_list->insert(R_EAX);
00069 ptr<set<ulint> > move_templates = set<ulint>::create();
00070 move_templates->insert(TEM_REGISTER_MOVE_1);
00071 new_reg = tm_register::create(R_AX, 16, dt_list, reg_list, move_templates, lstring("AX"),0);
00072 } break;
00073 case R_EAX: {
00074 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00075 dt_list->insert(DT_INT_32U);
00076 dt_list->insert(DT_INT_32S);
00077 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00078 reg_list->insert(R_EAX);
00079 reg_list->insert(R_AH);
00080 reg_list->insert(R_AL);
00081 reg_list->insert(R_AX);
00082 ptr<set<ulint> > move_templates = set<ulint>::create();
00083 move_templates->insert(TEM_REGISTER_MOVE_1);
00084 new_reg = tm_register::create(R_EAX, 32, dt_list, reg_list, move_templates, lstring("EAX"),0);
00085 } break;
00086 case R_BL: {
00087 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00088 dt_list->insert(DT_INT_8P);
00089 dt_list->insert(DT_INT_8U);
00090 dt_list->insert(DT_INT_8S);
00091 dt_list->insert(DT_BOOL);
00092 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00093 reg_list->insert(R_BL);
00094 reg_list->insert(R_BX);
00095 reg_list->insert(R_EBX);
00096 ptr<set<ulint> > move_templates = set<ulint>::create();
00097 move_templates->insert(TEM_REGISTER_MOVE_1);
00098 new_reg = tm_register::create(R_BL, 8, dt_list, reg_list, move_templates, lstring("BL"),0);
00099 } break;
00100 case R_BH: {
00101 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00102 dt_list->insert(DT_INT_8P);
00103 dt_list->insert(DT_INT_8U);
00104 dt_list->insert(DT_INT_8S);
00105 dt_list->insert(DT_BOOL);
00106 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00107 reg_list->insert(R_BH);
00108 reg_list->insert(R_BX);
00109 reg_list->insert(R_EBX);
00110 ptr<set<ulint> > move_templates = set<ulint>::create();
00111 move_templates->insert(TEM_REGISTER_MOVE_1);
00112 new_reg = tm_register::create(R_BH, 8, dt_list, reg_list, move_templates, lstring("BH"),0);
00113 } break;
00114 case R_BX: {
00115 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00116 dt_list->insert(DT_INT_16U);
00117 dt_list->insert(DT_INT_16S);
00118 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00119 reg_list->insert(R_BX);
00120 reg_list->insert(R_BH);
00121 reg_list->insert(R_BL);
00122 reg_list->insert(R_EBX);
00123 ptr<set<ulint> > move_templates = set<ulint>::create();
00124 move_templates->insert(TEM_REGISTER_MOVE_1);
00125 new_reg = tm_register::create(R_BX, 16, dt_list, reg_list, move_templates, lstring("BX"),0);
00126 } break;
00127 case R_EBX: {
00128 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00129 dt_list->insert(DT_INT_32U);
00130 dt_list->insert(DT_INT_32S);
00131 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00132 reg_list->insert(R_EBX);
00133 reg_list->insert(R_BH);
00134 reg_list->insert(R_BL);
00135 reg_list->insert(R_BX);
00136 ptr<set<ulint> > move_templates = set<ulint>::create();
00137 move_templates->insert(TEM_REGISTER_MOVE_1);
00138 new_reg = tm_register::create(R_EBX, 32, dt_list, reg_list, move_templates, lstring("EBX"),0);
00139 } break;
00140 case R_CL: {
00141 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00142 dt_list->insert(DT_INT_8P);
00143 dt_list->insert(DT_INT_8U);
00144 dt_list->insert(DT_INT_8S);
00145 dt_list->insert(DT_BOOL);
00146 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00147 reg_list->insert(R_CL);
00148 reg_list->insert(R_CX);
00149 reg_list->insert(R_ECX);
00150 ptr<set<ulint> > move_templates = set<ulint>::create();
00151 move_templates->insert(TEM_REGISTER_MOVE_1);
00152 new_reg = tm_register::create(R_CL, 8, dt_list, reg_list, move_templates, lstring("CL"),0);
00153 } break;
00154 case R_CH: {
00155 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00156 dt_list->insert(DT_INT_8P);
00157 dt_list->insert(DT_INT_8U);
00158 dt_list->insert(DT_INT_8S);
00159 dt_list->insert(DT_BOOL);
00160 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00161 reg_list->insert(R_CH);
00162 reg_list->insert(R_CX);
00163 reg_list->insert(R_ECX);
00164 ptr<set<ulint> > move_templates = set<ulint>::create();
00165 move_templates->insert(TEM_REGISTER_MOVE_1);
00166 new_reg = tm_register::create(R_CH, 8, dt_list, reg_list, move_templates, lstring("CH"),0);
00167 } break;
00168 case R_CX: {
00169 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00170 dt_list->insert(DT_INT_16U);
00171 dt_list->insert(DT_INT_16S);
00172 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00173 reg_list->insert(R_CX);
00174 reg_list->insert(R_CL);
00175 reg_list->insert(R_CH);
00176 reg_list->insert(R_ECX);
00177 ptr<set<ulint> > move_templates = set<ulint>::create();
00178 move_templates->insert(TEM_REGISTER_MOVE_1);
00179 new_reg = tm_register::create(R_CX, 16, dt_list, reg_list, move_templates, lstring("CX"),0);
00180 } break;
00181 case R_ECX: {
00182 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00183 dt_list->insert(DT_INT_32U);
00184 dt_list->insert(DT_INT_32S);
00185 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00186 reg_list->insert(R_ECX);
00187 reg_list->insert(R_CL);
00188 reg_list->insert(R_CH);
00189 reg_list->insert(R_CX);
00190 ptr<set<ulint> > move_templates = set<ulint>::create();
00191 move_templates->insert(TEM_REGISTER_MOVE_1);
00192 new_reg = tm_register::create(R_ECX, 32, dt_list, reg_list, move_templates, lstring("ECX"),0);
00193 } break;
00194 case R_DL: {
00195 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00196 dt_list->insert(DT_INT_8P);
00197 dt_list->insert(DT_INT_8U);
00198 dt_list->insert(DT_INT_8S);
00199 dt_list->insert(DT_BOOL);
00200 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00201 reg_list->insert(R_DL);
00202 reg_list->insert(R_DX);
00203 reg_list->insert(R_EDX);
00204 ptr<set<ulint> > move_templates = set<ulint>::create();
00205 move_templates->insert(TEM_REGISTER_MOVE_1);
00206 new_reg = tm_register::create(R_DL, 8, dt_list, reg_list, move_templates, lstring("DL"),0);
00207 } break;
00208 case R_DH: {
00209 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00210 dt_list->insert(DT_INT_8P);
00211 dt_list->insert(DT_INT_8U);
00212 dt_list->insert(DT_INT_8S);
00213 dt_list->insert(DT_BOOL);
00214 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00215 reg_list->insert(R_DH);
00216 reg_list->insert(R_DX);
00217 reg_list->insert(R_EDX);
00218 ptr<set<ulint> > move_templates = set<ulint>::create();
00219 move_templates->insert(TEM_REGISTER_MOVE_1);
00220 new_reg = tm_register::create(R_DH, 8, dt_list, reg_list, move_templates, lstring("DL"),0);
00221 } break;
00222 case R_DX: {
00223 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00224 dt_list->insert(DT_INT_16U);
00225 dt_list->insert(DT_INT_16S);
00226 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00227 reg_list->insert(R_DX);
00228 reg_list->insert(R_DL);
00229 reg_list->insert(R_DH);
00230 reg_list->insert(R_EDX);
00231 ptr<set<ulint> > move_templates = set<ulint>::create();
00232 move_templates->insert(TEM_REGISTER_MOVE_1);
00233 new_reg = tm_register::create(R_DX, 16, dt_list, reg_list, move_templates, lstring("DX"),0);
00234 } break;
00235 case R_EDX: {
00236 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00237 dt_list->insert(DT_INT_32U);
00238 dt_list->insert(DT_INT_32S);
00239 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00240 reg_list->insert(R_EDX);
00241 reg_list->insert(R_DL);
00242 reg_list->insert(R_DH);
00243 reg_list->insert(R_DX);
00244 ptr<set<ulint> > move_templates = set<ulint>::create();
00245 move_templates->insert(TEM_REGISTER_MOVE_1);
00246 new_reg = tm_register::create(R_EDX, 32, dt_list, reg_list, move_templates, lstring("EDX"),0);
00247 } break;
00248 case R_DI: {
00249 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00250 dt_list->insert(DT_INT_16U);
00251 dt_list->insert(DT_INT_16S);
00252 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00253 reg_list->insert(R_DI);
00254 reg_list->insert(R_EDI);
00255 ptr<set<ulint> > move_templates = set<ulint>::create();
00256 move_templates->insert(TEM_REGISTER_MOVE_1);
00257 new_reg = tm_register::create(R_DI, 16, dt_list, reg_list, move_templates, lstring("DI"),0);
00258 } break;
00259 case R_EDI: {
00260 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00261 dt_list->insert(DT_INT_32U);
00262 dt_list->insert(DT_INT_32S);
00263 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00264 reg_list->insert(R_EDI);
00265 reg_list->insert(R_DI);
00266 ptr<set<ulint> > move_templates = set<ulint>::create();
00267 move_templates->insert(TEM_REGISTER_MOVE_1);
00268 new_reg = tm_register::create(R_EDI, 32, dt_list, reg_list, move_templates, lstring("EDI"),0);
00269 } break;
00270 case R_SI: {
00271 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00272 dt_list->insert(DT_INT_16U);
00273 dt_list->insert(DT_INT_16S);
00274 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00275 reg_list->insert(R_SI);
00276 reg_list->insert(R_ESI);
00277 ptr<set<ulint> > move_templates = set<ulint>::create();
00278 move_templates->insert(TEM_REGISTER_MOVE_1);
00279 new_reg = tm_register::create(R_SI, 16, dt_list, reg_list, move_templates, lstring("SI"),0);
00280 } break;
00281 case R_ESI: {
00282 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00283 dt_list->insert(DT_INT_32U);
00284 dt_list->insert(DT_INT_32S);
00285 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00286 reg_list->insert(R_ESI);
00287 reg_list->insert(R_SI);
00288 ptr<set<ulint> > move_templates = set<ulint>::create();
00289 move_templates->insert(TEM_REGISTER_MOVE_1);
00290 new_reg = tm_register::create(R_ESI, 32, dt_list, reg_list, move_templates, lstring("ESI"),0);
00291 } break;
00292 case R_COND: {
00293 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00294 dt_list->insert(DT_COND);
00295 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00296 reg_list->insert(R_COND);
00297 ptr<set<ulint> > move_templates = set<ulint>::create();
00298 move_templates->insert(TEM_REGISTER_MOVE_2);
00299 move_templates->insert(TEM_REGISTER_MOVE_3);
00300 move_templates->insert(TEM_REGISTER_MOVE_4);
00301 new_reg = tm_register::create(R_COND, 8, dt_list, reg_list, move_templates, lstring(""),0);
00302 } break;
00303 case R_ESP: {
00304 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00305 dt_list->insert(DT_INT_32U);
00306 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00307 reg_list->insert(R_ESP);
00308 ptr<set<ulint> > move_templates = set<ulint>::create();
00309 move_templates->insert(TEM_REGISTER_MOVE_5);
00310 new_reg = tm_register::create(R_ESP, 32, dt_list, reg_list, move_templates, lstring("ESP"),RF_NOSPILL);
00311 } break;
00312 case R_EBP: {
00313 ptr<set<tm_data_type_base::id_type> > dt_list = set<tm_data_type_base::id_type>::create();
00314 dt_list->insert(DT_INT_32U);
00315 ptr<set<tm_register_base::id_type> > reg_list = set<tm_register_base::id_type>::create();
00316 reg_list->insert(R_EBP);
00317 ptr<set<ulint> > move_templates = set<ulint>::create();
00318 move_templates->insert(TEM_REGISTER_MOVE_5);
00319 new_reg = tm_register::create(R_EBP, 32, dt_list, reg_list, move_templates, lstring("EBP"),RF_NOSPILL);
00320 } break;
00321
00322 default: lassert(false); break;
00323
00324 }
00325
00326 lassert(new_reg);
00327 id_to_instance_get()->insert(::std::pair<tm_register_base::id_type, srp<tm_register> >(id,new_reg));
00328 return new_reg;
00329 }
00330
00331 end_package(registers);
00332 end_package(md);
00333 end_package(lestes);