00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <math.h>
00022 #include "branch_profile.h"
00023 #include "node_table.h"
00024 #include "util.h"
00025 #include <assert.h>
00026 #include <legoUtil.H>
00027 #include "lego_util.h"
00028 #include "predicate.h"
00029
00030
00031
00032 #ifdef BRANCHDEBUG
00033 #define BRANCHLEVEL 0
00034 #define Bdb(level,format,args...) (BRANCHLEVEL>=level)?emit_message(format,##args):NULL
00035 #define Bdb_call(level,args) (BRANCHLEVEL>=level)?args:NULL
00036 #else
00037 #define Bdb(level,format,args...)
00038 #define Bdb_call(level,args)
00039 #endif //BRANCHDEBUG
00040
00041
00042
00043
00044 void Branch_Profile::doit(legoModule *module_ptr,int interested_opcode)
00045 {
00046 Bdb(1,"Branch_Profile::doit");
00047
00048 Predicate::init_true_predicate_oprd();
00049
00050 int proc_count=module_ptr->GetCount();
00051
00052
00053 FILE *table_fp;
00054 unsigned int start_index;
00055
00056 for(int i=0;i<proc_count;i++)
00057 {
00058 legoProc *proc_ptr;
00059 proc_ptr=(legoProc *)module_ptr->GetItem(i);
00060 assert(proc_ptr->GetRegionType()==RT_PROC);
00061
00062 if(strcmp(proc_ptr->GetProcName(),"_main")==0)
00063 {
00064 instrument_main(module_ptr,proc_ptr);
00065 }
00066
00067
00068 Node_Table *node_table;
00069 node_table=new Node_Table();
00070 if(i==0)
00071 {
00072 node_table->open_file("BRaNCH_PT");
00073 table_fp=node_table->node_table_fp();
00074 }
00075 else
00076 {
00077 node_table->set_node_table_fp(table_fp);
00078 node_table->set_start_index(start_index);
00079 }
00080 node_table->set_proc_name(proc_ptr->GetProcName());
00081
00082
00083 int num_of_interested_ops=0;
00084
00085 Bdb(3,"%s",proc_ptr->GetProcName());
00086 int region_count=proc_ptr->GetCount();
00087 for(int j=0;j<region_count;j++)
00088 {
00089 legoRegion *region_ptr=(legoRegion *)proc_ptr->GetItem(j);
00090 if (IS_BLOCK( region_ptr->GetRegionType() ) ) {
00091 Bdb(3,"region_id %d",region_ptr->GetRegionId());
00092 opList *entry_op_list=region_ptr->GetEntryOpsPtr();
00093 legoOp *op_ptr=entry_op_list->GetOpPtr();
00094 for(;op_ptr!=NULL;op_ptr=op_ptr->GetNextLink())
00095 {
00096 int op_code=op_ptr->GetOpcode();
00097 Bdb(3,"%s",ParseMap(op_code));
00098
00099 if(op_code==BRCT)
00100 {
00101 num_of_interested_ops++;
00102 }
00103 }
00104 }
00105 else {
00106 int treegion_bb_count=region_ptr->GetCount();
00107 for(int k=0;k<treegion_bb_count;k++) {
00108 legoRegion *treegion_bb_ptr=(legoRegion *)region_ptr->GetItem(k);
00109 Bdb(3,"region_id %d",treegion_bb_ptr->GetRegionId());
00110 opList *entry_op_list=treegion_bb_ptr->GetEntryOpsPtr();
00111 legoOp *op_ptr=entry_op_list->GetOpPtr();
00112 for(;op_ptr!=NULL;op_ptr=op_ptr->GetNextLink())
00113 {
00114 int op_code=op_ptr->GetOpcode();
00115 Bdb(3,"%s",ParseMap(op_code));
00116
00117 if(op_code==BRCT)
00118 {
00119 num_of_interested_ops++;
00120 }
00121 }
00122 }
00123 }
00124 }
00125
00126 Bdb(3,"num_of_interested_ops=%d",num_of_interested_ops);
00127
00128 node_table->add_num_of_entries(num_of_interested_ops);
00129
00130 instrument(proc_ptr,node_table,interested_opcode);
00131
00132 start_index=node_table->start_index();
00133 node_table->print(node_table->node_table_fp());
00134 Bdb_call(3,node_table->print(stderr));
00135 Bdb_call(3,getchar());
00136 }
00137
00138 fclose(table_fp);
00139
00140 open_main_file(start_index);
00141 open_header_file();
00142 close_main_file();
00143 close_header_file();
00144 }
00145
00146
00147
00148
00149
00150
00151 attrs *Branch_Profile::write_attribute(legoProc *proc_ptr)
00152 {
00153 attrs *attrs_ptr=proc_ptr->GetAttrDictionary();
00154
00155 while(attrs_ptr->GetNextAttrPtr()!=NULL)
00156 {
00157 attrs_ptr=attrs_ptr->GetNextAttrPtr();
00158 }
00159
00160 int new_attr_id=attrs_ptr->GetAttrId()+1;
00161
00162 attrs *new_attr=new attrs();
00163 new_attr->SetAttrType(ATTR_LC);
00164 new_attr->SetAttrId(new_attr_id);
00165 new_attr->SetAttrString("tr");
00166
00167 legoOprd *dest_p1_oprd=new legoOprd();
00168 dest_p1_oprd->SetOprdType(OT_MACRO);
00169 dest_p1_oprd->SetOprdRegNum(INT_P1);
00170
00171 legoOprd *dest_p2_oprd=new legoOprd();
00172 dest_p2_oprd->SetOprdType(OT_MACRO);
00173 dest_p2_oprd->SetOprdRegNum(INT_P2);
00174
00175 dest_p1_oprd->SetNextOprdPtr(dest_p2_oprd);
00176
00177 legoOprd *dest_ret_oprd=new legoOprd();
00178 dest_ret_oprd->SetOprdType(OT_MACRO);
00179 dest_ret_oprd->SetOprdRegNum(RET_ADDR);
00180
00181 new_attr->SetAttrOprdPtr(dest_p1_oprd);
00182
00183 attrs *next_lc=new attrs();
00184 next_lc->SetAttrType(ATTR_LC);
00185 next_lc->SetAttrId(new_attr_id);
00186 next_lc->SetAttrString("ret");
00187 next_lc->SetAttrOprdPtr(dest_ret_oprd);
00188
00189 new_attr->SetNextLcEntryPtr(next_lc);
00190 attrs_ptr->SetNextAttrPtr(new_attr);
00191
00192 Bdb_call(3,WriteAttrs(proc_ptr,stderr));
00193
00194 return new_attr;
00195 }
00196
00197 void Branch_Profile::instrument(legoProc *proc_ptr,Node_Table *node_table,int interested_opcode)
00198 {
00199 int max_reg1=find_max_reg_num(proc_ptr)+1;
00200 int max_reg2=max_reg1 + 1;
00201 int max_reg3=max_reg2 + 1;
00202
00203
00204 int region_count=proc_ptr->GetCount();
00205 for(int j=0;j<region_count;j++)
00206 {
00207 legoRegion *region_ptr=(legoRegion *)proc_ptr->GetItem(j);
00208 if (IS_BLOCK( region_ptr->GetRegionType() ) ) {
00209 Bdb(3,"region_id %d",region_ptr->GetRegionId());
00210 opList *entry_op_list=region_ptr->GetEntryOpsPtr();
00211 legoOp *from_op_ptr=entry_op_list->GetOpPtr();
00212 for(;from_op_ptr!=NULL;from_op_ptr=from_op_ptr->GetNextLink())
00213 {
00214 int from_op_code=from_op_ptr->GetOpcode();
00215 Bdb(3,"%s",ParseMap(from_op_code));
00216
00217 if(from_op_code==BRCT)
00218 {
00219 unsigned int mapping=node_table->start_index();
00220
00221 legoOprd *taken_oprd=from_op_ptr->GetSrcOprdPtr()->GetNextOprdPtr();
00222
00223
00224
00225
00226 legoOprd *address_oprd=new legoOprd();
00227 address_oprd->SetOprdType(OT_REG);
00228 address_oprd->SetOprdRegType(RT_R);
00229 address_oprd->SetOprdRegNum(max_reg1);
00230 address_oprd->SetOprdFileType(FT_BTR);
00231 address_oprd->SetOprdDataType(DT_B);
00232
00233 legoOprd *save_p1_oprd=new legoOprd();
00234 save_p1_oprd->SetOprdType(OT_REG);
00235 save_p1_oprd->SetOprdRegType(RT_R);
00236 save_p1_oprd->SetOprdRegNum(max_reg2);
00237 save_p1_oprd->SetOprdFileType(FT_GPR);
00238 save_p1_oprd->SetOprdDataType(DT_I);
00239
00240 legoOprd *save_p2_oprd=new legoOprd();
00241 save_p2_oprd->SetOprdType(OT_REG);
00242 save_p2_oprd->SetOprdRegType(RT_R);
00243 save_p2_oprd->SetOprdRegNum(max_reg3);
00244 save_p2_oprd->SetOprdFileType(FT_GPR);
00245 save_p2_oprd->SetOprdDataType(DT_I);
00246
00247 legoOprd *dest_p1_oprd=new legoOprd();
00248 dest_p1_oprd->SetOprdType(OT_MACRO);
00249 dest_p1_oprd->SetOprdRegNum(INT_P1);
00250
00251 legoOprd *dest_p2_oprd=new legoOprd();
00252 dest_p2_oprd->SetOprdType(OT_MACRO);
00253 dest_p2_oprd->SetOprdRegNum(INT_P2);
00254
00255 legoOprd *dest_ret_oprd=new legoOprd();
00256 dest_ret_oprd->SetOprdType(OT_MACRO);
00257 dest_ret_oprd->SetOprdRegNum(RET_ADDR);
00258
00259 attrs *attr_ptr=write_attribute(proc_ptr);
00260 attrList *attr_list=new attrList();
00261 attr_list->SetAttrPtr(attr_ptr);
00262 attr_list->SetAttrType(attr_ptr->GetAttrType());
00263 attr_list->SetAttrId(attr_ptr->GetAttrId());
00264 attr_list->SetValid(1);
00265
00266 insert_branch_predictor(mapping,proc_ptr,region_ptr,address_oprd,save_p1_oprd,dest_p1_oprd,save_p2_oprd,dest_p2_oprd,Predicate::true_predicate_oprd(),from_op_ptr,taken_oprd,"_MY_BRaNCH_PRoBe",attr_list,dest_ret_oprd);
00267
00268
00269 node_table->add_entry(from_op_ptr->GetOpId());
00270 }
00271
00272 }
00273 }
00274 else {
00275 int treegion_bb_count=region_ptr->GetCount();
00276 for(int k=0;k<treegion_bb_count;k++) {
00277 legoRegion *treegion_bb_ptr=(legoRegion *)region_ptr->GetItem(k);
00278 Bdb(3,"region_id %d",treegion_bb_ptr->GetRegionId());
00279 opList *entry_op_list=treegion_bb_ptr->GetEntryOpsPtr();
00280 legoOp *from_op_ptr=entry_op_list->GetOpPtr();
00281 for(;from_op_ptr!=NULL;from_op_ptr=from_op_ptr->GetNextLink())
00282 {
00283 int from_op_code=from_op_ptr->GetOpcode();
00284 Bdb(3,"%s",ParseMap(from_op_code));
00285
00286 if(from_op_code==BRCT)
00287 {
00288 unsigned int mapping=node_table->start_index();
00289
00290 legoOprd *taken_oprd=from_op_ptr->GetSrcOprdPtr()->GetNextOprdPtr();
00291
00292
00293
00294
00295 legoOprd *address_oprd=new legoOprd();
00296 address_oprd->SetOprdType(OT_REG);
00297 address_oprd->SetOprdRegType(RT_R);
00298 address_oprd->SetOprdRegNum(max_reg1);
00299 address_oprd->SetOprdFileType(FT_BTR);
00300 address_oprd->SetOprdDataType(DT_B);
00301
00302 legoOprd *save_p1_oprd=new legoOprd();
00303 save_p1_oprd->SetOprdType(OT_REG);
00304 save_p1_oprd->SetOprdRegType(RT_R);
00305 save_p1_oprd->SetOprdRegNum(max_reg2);
00306 save_p1_oprd->SetOprdFileType(FT_GPR);
00307 save_p1_oprd->SetOprdDataType(DT_I);
00308
00309 legoOprd *save_p2_oprd=new legoOprd();
00310 save_p2_oprd->SetOprdType(OT_REG);
00311 save_p2_oprd->SetOprdRegType(RT_R);
00312 save_p2_oprd->SetOprdRegNum(max_reg3);
00313 save_p2_oprd->SetOprdFileType(FT_GPR);
00314 save_p2_oprd->SetOprdDataType(DT_I);
00315
00316 legoOprd *dest_p1_oprd=new legoOprd();
00317 dest_p1_oprd->SetOprdType(OT_MACRO);
00318 dest_p1_oprd->SetOprdRegNum(INT_P1);
00319
00320 legoOprd *dest_p2_oprd=new legoOprd();
00321 dest_p2_oprd->SetOprdType(OT_MACRO);
00322 dest_p2_oprd->SetOprdRegNum(INT_P2);
00323
00324 legoOprd *dest_ret_oprd=new legoOprd();
00325 dest_ret_oprd->SetOprdType(OT_MACRO);
00326 dest_ret_oprd->SetOprdRegNum(RET_ADDR);
00327
00328 attrs *attr_ptr=write_attribute(proc_ptr);
00329 attrList *attr_list=new attrList();
00330 attr_list->SetAttrPtr(attr_ptr);
00331 attr_list->SetAttrType(attr_ptr->GetAttrType());
00332 attr_list->SetAttrId(attr_ptr->GetAttrId());
00333 attr_list->SetValid(1);
00334
00335 insert_branch_predictor(mapping,proc_ptr,treegion_bb_ptr,address_oprd,save_p1_oprd,dest_p1_oprd,save_p2_oprd,dest_p2_oprd,Predicate::true_predicate_oprd(),from_op_ptr,taken_oprd,"_MY_BRaNCH_PRoBe",attr_list,dest_ret_oprd);
00336
00337
00338 node_table->add_entry(from_op_ptr->GetOpId());
00339 }
00340 }
00341 }
00342 }
00343 }
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 void Branch_Profile::insert_branch_predictor(int index,legoProc *proc_ptr,legoRegion *region_ptr,legoOprd *address_oprd,legoOprd *save_p1_oprd,legoOprd *dest_p1_oprd,legoOprd *save_p2_oprd,legoOprd *dest_p2_oprd,legoOprd *predicate_oprd,legoOp *from_op_ptr,legoOprd *taken_oprd,char *probe_name,attrList *attr_list,legoOprd *dest_ret_oprd)
00362 {
00363 int max_op_id=(FindMaxOpId(proc_ptr))->GetOpId()+1;
00364
00365
00366
00367
00368
00369 legoOp *new_op_ptr=new legoOp(max_op_id++);
00370 new_op_ptr->SetOpcode(MOVE);
00371 new_op_ptr->SetSrcOprdPtr(dest_p1_oprd);
00372 new_op_ptr->SetDestOprdPtr(save_p1_oprd);
00373 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00374 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00375
00376
00377 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00378
00379
00380
00381
00382
00383 new_op_ptr=new legoOp(max_op_id++);
00384 new_op_ptr->SetOpcode(MOVE);
00385 new_op_ptr->SetSrcOprdPtr(dest_p2_oprd);
00386 new_op_ptr->SetDestOprdPtr(save_p2_oprd);
00387 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00388 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00389
00390
00391 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00392
00393
00394
00395
00396
00397 new_op_ptr=new legoOp(max_op_id++);
00398 new_op_ptr->SetOpcode(MOVE);
00399
00400 legoOprd *src_oprd=new legoOprd();
00401 src_oprd->SetOprdType(OT_LITERAL_I);
00402 src_oprd->SetLiteralInteger(index);
00403
00404 new_op_ptr->SetSrcOprdPtr(src_oprd);
00405 new_op_ptr->SetDestOprdPtr(dest_p1_oprd);
00406 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00407 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00408
00409
00410 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00411
00412
00413
00414
00415
00416 new_op_ptr=new legoOp(max_op_id++);
00417
00418 new_op_ptr->SetOpcode(MOVE);
00419 new_op_ptr->SetSrcOprdPtr(taken_oprd);
00420 new_op_ptr->SetDestOprdPtr(dest_p2_oprd);
00421 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00422 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00423
00424
00425 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00426
00427
00428
00429
00430
00431 new_op_ptr=new legoOp(max_op_id++);
00432 new_op_ptr->SetOpcode(PBRR);
00433
00434 src_oprd=new legoOprd();
00435 src_oprd->SetOprdType(OT_LITERAL_L);
00436 src_oprd->SetLiteralLabel(probe_name);
00437 src_oprd->SetLiteralAddrStyle(AS_G_ABS);
00438
00439 new_op_ptr->SetSrcOprdPtr(src_oprd);
00440 new_op_ptr->SetDestOprdPtr(address_oprd);
00441 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00442 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00443
00444 Bdb_call(2,WriteOps(new_op_ptr,1,stderr,0));
00445 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00446
00447
00448
00449
00450
00451 new_op_ptr=new legoOp(max_op_id++);
00452 new_op_ptr->SetOpcode(BRL);
00453
00454 new_op_ptr->SetSrcOprdPtr(address_oprd);
00455 new_op_ptr->SetDestOprdPtr(dest_ret_oprd);
00456 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00457 new_op_ptr->SetOpAttrListPtr(attr_list);
00458 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00459
00460
00461 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00462
00463
00464
00465
00466
00467 new_op_ptr=new legoOp(max_op_id++);
00468 new_op_ptr->SetOpcode(MOVE);
00469
00470 new_op_ptr->SetSrcOprdPtr(save_p1_oprd);
00471 new_op_ptr->SetDestOprdPtr(dest_p1_oprd);
00472 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00473 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00474
00475
00476 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00477
00478
00479
00480
00481
00482 new_op_ptr=new legoOp(max_op_id++);
00483 new_op_ptr->SetOpcode(MOVE);
00484
00485 new_op_ptr->SetSrcOprdPtr(save_p2_oprd);
00486 new_op_ptr->SetDestOprdPtr(dest_p2_oprd);
00487 new_op_ptr->SetPredOprdPtr(predicate_oprd);
00488 new_op_ptr->SetSchedTime(from_op_ptr->GetSchedTime());
00489
00490
00491 insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00492
00493 }
00494
00495 void Branch_Profile::instrument_main(legoModule *module_ptr,legoProc *proc_ptr)
00496 {
00497
00498
00499
00500 symbolTable *text_ptr=module_ptr->GetTextPtr();
00501 Bdb_call(3,text_ptr->WriteRebel(stderr));
00502
00503 for(int i=0;i<text_ptr->GetVarCount();i++)
00504 {
00505 nameTable *nt=text_ptr->GetVarTablePtr(i);
00506 if(strcmp(nt->GetVarName(),"_main")==0)
00507 {
00508 Bdb_call(3,nt->WriteRebel(stderr));
00509 nt->SetVarName("_MaiN");
00510 Bdb_call(3,nt->WriteRebel(stderr));
00511 }
00512 }
00513
00514
00515
00516
00517 proc_ptr->SetProcName("_MaiN");
00518 }
00519
00520
00521 void Branch_Profile::lego_write(legoModule *module_ptr,char *input_filename)
00522 {
00523 Bdb(1,"Branch_Profile::lego_write");
00524 char *output_filename=new char[strlen(input_filename)+7];
00525 strcpy(output_filename,input_filename);
00526
00527 int i=strlen(input_filename)-3;
00528
00529 output_filename[i+0]='_';
00530 output_filename[i+1]='B';
00531 output_filename[i+2]='R';
00532 output_filename[i+3]='a';
00533 output_filename[i+4]='N';
00534 output_filename[i+5]='C';
00535 output_filename[i+6]='H';
00536 output_filename[i+7]='.';
00537 output_filename[i+8]='e';
00538 output_filename[i+9]='l';
00539 output_filename[i+10]='\0';
00540
00541 LegoWrite(module_ptr,output_filename);
00542 }
00543
00544 void Branch_Profile::open_main_file(unsigned int max_entry)
00545 {
00546 _main_fp=fopen(BRANCH_MAIN_FILENAME,"w");
00547
00548 if(_main_fp==NULL)
00549 {
00550 fprintf(stderr,"Error open file:%s\n",BRANCH_MAIN_FILENAME);
00551 exit(0);
00552 }
00553
00554 fprintf(_main_fp,"/*\n\tFile: %s\n",BRANCH_MAIN_FILENAME);
00555 fprintf(_main_fp,"\tAuthor: Matt Jennings from Chao-ying Fu's VaLue_PRoFiLe.c\n");
00556 fprintf(_main_fp,"\tDate: March 17, 1999\n*/\n\n");
00557 fprintf(_main_fp,"#define MAX_ENTRY %u\n\n",max_entry);
00558
00559 unsigned int max_predictor_entry=0;
00560
00561 if(max_entry>0)
00562 {
00563 max_predictor_entry=1<<(unsigned int)ceil(log(max_entry)/log(2));
00564 }
00565 else
00566 {
00567 fprintf(stderr,"max_entry==0\n");
00568 }
00569
00570 fprintf(_main_fp,"#define MAX_PREDICTOR_ENTRY %u\n\n",max_predictor_entry);
00571 fprintf(_main_fp,"#include <stdio.h>\n\n");
00572 fprintf(_main_fp,"#include \"branch_predictor.h\"\n\n");
00573
00574 fprintf(_main_fp,"extern long MaiN(int argc,char **argv);\n");
00575 fprintf(_main_fp,"void MY_iNiT();\n");
00576 fprintf(_main_fp,"void MY_eXiT();\n");
00577
00578 fprintf(_main_fp,"int main(int argc,char **argv)\n");
00579 fprintf(_main_fp,"{\n");
00580 fprintf(_main_fp," MY_iNiT();\n");
00581 fprintf(_main_fp," atexit(MY_eXiT);\n");
00582 fprintf(_main_fp," MaiN(argc,argv);\n");
00583 fprintf(_main_fp,"}\n\n");
00584
00585
00586
00587
00588
00589
00590
00591 fprintf(_main_fp,"void MY_iNiT()\n");
00592 fprintf(_main_fp,"{\n");
00593 fprintf(_main_fp," read_branch_predictor_parms();\n");
00594 fprintf(_main_fp," init_branch_predictor();\n");
00595 fprintf(_main_fp,"}\n\n");
00596
00597 fprintf(_main_fp,"void MY_eXiT()\n");
00598 fprintf(_main_fp,"{\n");
00599 fprintf(_main_fp," FILE *ifp;\n");
00600 fprintf(_main_fp," ifp=fopen(\"branch.acc\",\"w\");\n");
00601 fprintf(_main_fp," if(ifp==NULL)\n");
00602 fprintf(_main_fp," {\n");
00603 fprintf(_main_fp," fprintf(stderr,\"Error open file: branch.acc!\\n\");\n");
00604 fprintf(_main_fp," exit(0);\n");
00605 fprintf(_main_fp," }\n");
00606 fprintf(_main_fp," output_branch_history_entry(ifp);\n");
00607
00608 fprintf(_main_fp," printf(\"\\nTotal Accesses: ");
00609 fputc('%',_main_fp);
00610 fprintf(_main_fp,"lu Total Mispredictions: ");
00611 fputc('%',_main_fp);
00612 fprintf(_main_fp,"lu\\n\",\n");
00613 fprintf(_main_fp," total_accesses, total_miss_predicted);\n");
00614 fprintf(_main_fp,"}\n\n");
00615
00616 }
00617
00618 void Branch_Profile::close_main_file()
00619 {
00620 fclose(_main_fp);
00621 }
00622
00623 void Branch_Profile::open_header_file()
00624 {
00625 _header_fp=fopen(BRANCH_HEADER_FILENAME,"r");
00626 if(_header_fp==NULL)
00627 {
00628 _header_fp=fopen(BRANCH_HEADER_FILENAME,"w");
00629
00630 if(_header_fp==NULL)
00631 assert(0);
00632
00633 fprintf(_header_fp," extern void MY_BRaNCH_PRoBe (int,int);\n");
00634 }
00635 }
00636
00637 void Branch_Profile::close_header_file()
00638 {
00639 fclose(_header_fp);
00640 }
00641