Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

branch_profile.cpp

Go to the documentation of this file.
00001 /*
00002         Copyright (C) 1997 CFU Corporation
00003 
00004         File: branch_profile.cpp
00005         Author: Matt Jennings from Chao-ying Fu's value_profile.h
00006         Date: March 17 1999
00007 
00008         ^..^
00009         (00)
00010 
00011          $__$
00012         <~00~>
00013          (oo)
00014           ||
00015 
00016         ```````
00017         C ^|^ D
00018          \ O /
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 //#define BRANCHDEBUG
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 // interested_opcode: operations to be profiled
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 { // otherwise this is a treegion
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 // Create an attribute
00148 // Ex:   
00149 // lc ^287 ({"tr" (m<int_p1> m<int_p2> m<int_p3>)}{"ret" (m<ret_addr>)})
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         // For PBRR, branch target register
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 { // otherwise this is a treegion
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         // For PBRR, branch target register
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 // Insert branch predictor before from_op_ptr
00348 // int_p1 contains index (mapping) 
00349 // int_p2 contains taken or not-taken from predicate register
00350 //
00351 // Ex:
00352 // op 184 (MOVE [r<84:i gpr>] [m<int_p1>] p<t>)
00353 // op 185 (MOVE [r<85:i gpr>] [m<int_p2>] p<t>)
00354 // op 186 (MOVE [m<int_p1>] [i<0>] p<t>)
00355 // op 187 (MOVEPG [m<int_p2>] [r<11:i pr>] p<t>)
00356 // op 188 (PBRR [r<83:b btr>] [l:g_abs<_MY_BRaNCH_PRoBe>] p<t>)
00357 // op 189 (BRL [m<ret_addr>] [r<83:b btr>] p<t> attr(lc ^287))
00358 // op 190 (MOVE [m<int_p1>] [r<84:i gpr>] p<t>)
00359 // op 191 (MOVE [m<int_p2>] [r<85:i gpr>] p<t>)
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         // Step 1: Save int_p1 register
00367         // ex: op 184 (MOVE [r<84:i gpr>] [m<int_p1>] p<t>)
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         //WriteOps(new_op_ptr,1,stderr,0);
00377         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00378 
00379         //
00380         // Step 2: Save int_p2 register
00381         // ex: op 185 (MOVE [r<85:i gpr>] [m<int_p2>] p<t>)
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         //WriteOps(new_op_ptr,1,stderr,0);
00391         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00392 
00393         //
00394         // Step 4: Set int_p1 to index
00395         // ex: op 187 (MOVE [m<int_p1>] [i<0>] p<t>)
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         //WriteOps(new_op_ptr,1,stderr,0);
00410         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00411 
00412         //
00413         // Step 5: Set int_p2 to predicate of BRCT (taken if T, not-taken if F)
00414         // ex: op 188 (MOVEPG [m<int_p2>] [r<11:i pr>] p<t>)
00415         //
00416         new_op_ptr=new legoOp(max_op_id++);
00417         //new_op_ptr->SetOpcode(MOVEPG);
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         //WriteOps(new_op_ptr,1,stderr,0);
00425         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00426 
00427         //
00428         // Step 7: Prepare to branch
00429         // ex: op 190 (PBRR [r<83:b btr>] [l:g_abs<_MY_BRaNCH_PRoBe>] p<t>)
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         // Step 8: Branch and link
00449         // ex: op 191 (BRL [m<ret_addr>] [r<83:b btr>] p<t> attr(lc ^287))
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         //WriteOps(new_op_ptr,1,stderr,0);
00461         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00462 
00463         //
00464         // Step 9: Restore int_p1
00465         // ex: op 192 (MOVE [m<int_p1>] [r<84:i gpr>] p<t>)
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         //WriteOps(new_op_ptr,1,stderr,0);
00476         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00477 
00478         //
00479         // Step 10: Restore int_p2
00480         // ex: op 193 (MOVE [m<int_p2>] [r<85:i gpr>] p<t>)
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         //WriteOps(new_op_ptr,1,stderr,0);
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         // Update symbolTable (ms text)
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         // Update proc name
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 //        fprintf(_main_fp,"#include \"yula_pa_reg_def.h\"\n\n");
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 //      fprintf(_main_fp,"inline void copy_frame (char *copy_to,int that_many)\n");
00586 //        fprintf(_main_fp,"{\n");
00587 //        fprintf(_main_fp,"      int i;\n");
00588 //        fprintf(_main_fp,"      for(i=0;i<that_many;i++) *(char *)(copy_to + i) = global_macro_op[i];\n");
00589 //        fprintf(_main_fp,"}\n\n");
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 //        fprintf(_main_fp,"    printf(\"\\nTotal Accesses: \%lu  Total Mispredictions: \%lu\\n\",\n");
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 

Generated on Mon Jul 21 20:24:02 2003 for TINKER LEGO DOC by doxygen 1.3.2