00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "defs.h"
00044 #include "config.h"
00045 #include "ipfec_options.h"
00046 #include "string.h"
00047 #include "flags.h"
00048 #include "tracing.h"
00049 #include "mempool.h"
00050 #include "cxx_memory.h"
00051
00052
00053 BOOL CG_Enable_Ipfec_Phases = TRUE;
00054 BOOL EMIT_count_cycles = FALSE;
00055
00056 BOOL IPFEC_Enable_Region_Formation = TRUE;
00057 BOOL IPFEC_Enable_Region_Decomposition = TRUE;
00058 INT32 IPFEC_Enable_Tail_Duplication = FALSE;
00059 INT32 IPFEC_Enable_Exit_Probability = FALSE;
00060 INT32 IPFEC_Stacked_Cut_Num = 0;
00061 INT32 IPFEC_Stacked_Spill_Num = 0;
00062 BOOL IPFEC_Enable_If_Conversion = TRUE;
00063 BOOL IPFEC_Force_If_Conv = FALSE;
00064 BOOL IPFEC_Relaxed_If_Conv = TRUE;
00065 BOOL IPFEC_Force_Para_Comp_Gen = FALSE;
00066 BOOL IPFEC_Para_Comp_Gen = TRUE;
00067 BOOL IPFEC_Combine_Exit = FALSE;
00068 BOOL IPFEC_Disable_Merge_BB = FALSE;
00069 BOOL IPFEC_Enable_PRDB= TRUE;
00070 BOOL IPFEC_Enable_BB_Verify = FALSE;
00071 BOOL IPFEC_Enable_Prepass_GLOS = TRUE;
00072 BOOL IPFEC_Enable_Opt_after_schedule = TRUE;
00073 BOOL IPFEC_Enable_Postpass_GLOS = FALSE;
00074 BOOL IPFEC_Enable_Prepass_LOCS = FALSE;
00075 BOOL IPFEC_Enable_Postpass_LOCS = TRUE;
00076 BOOL IPFEC_Enable_Speculation = TRUE;
00077 BOOL IPFEC_Enable_Data_Speculation = TRUE;
00078 BOOL IPFEC_Enable_Cntl_Speculation = TRUE;
00079 BOOL IPFEC_Enable_FP_Ld_Speculation = FALSE;
00080 BOOL IPFEC_Enable_Data_Spec_Res_Aware = TRUE;
00081 BOOL IPFEC_Enable_Compressed_Template = TRUE;
00082 BOOL IPFEC_Glos_Reg_Pressure_Aware = TRUE;
00083 BOOL IPFEC_Stress_Spec = FALSE;
00084 BOOL IPFEC_Glos_Motion_Across_Calls = FALSE ;
00085 BOOL IPFEC_Glos_Split_Entry_BB = TRUE ;
00086 BOOL IPFEC_Glos_Split_Exit_BB = TRUE ;
00087 BOOL IPFEC_Glos_Enable_P_Ready_Code_Motion = TRUE;
00088 BOOL IPFEC_Glos_Code_Motion_Across_Nested_Rgn = TRUE;
00089 BOOL IPFEC_Glos_Enable_Cntl_Spec_If_Converted_Code = FALSE;
00090 BOOL IPFEC_Glos_Enable_Renaming = TRUE;
00091 BOOL IPFEC_Adjust_Variable_Latency = TRUE ;
00092 BOOL IPFEC_Enable_Edge_Profile = FALSE;
00093 BOOL IPFEC_Enable_Value_Profile = FALSE;
00094 BOOL IPFEC_Enable_Stride_Profile = FALSE;
00095 BOOL IPFEC_Enable_Random_Prob = FALSE;
00096 BOOL IPFEC_Enable_Edge_Profile_Annot = FALSE;
00097 INT32 IPFEC_Enable_Stride_Prefetch = FALSE;
00098 INT32 Value_Profile_Pu_ID=-1;
00099 UINT32 Value_Instr_Range=0x0000ffff;
00100 UINT32 Value_Instr_Pu_Id=0x0000ffff;
00101 UINT64 Value_Instr_Pu_Id_Mask=0;
00102 char *Instru_File_Name = "";
00103 char *Fb_File_Name = "";
00104 char *Value_Instru_File_Name = "";
00105 char *Stride_Instru_File_Name = "";
00106 char *Value_Fb_File_Name = "";
00107 char *Stride_Fb_File_Name = "";
00108 BOOL IPFEC_Enable_Value_Profile_Annot = FALSE;
00109 BOOL IPFEC_Enable_Stride_Profile_Annot = FALSE;
00110 BOOL IPFEC_Enable_Pre_Bundling = TRUE;
00111 BOOL IPFEC_Force_CHK_Fail = FALSE;
00112 BOOL IPFEC_Chk_Compact = TRUE;
00113 BOOL IPFEC_Enable_Cascade = TRUE;
00114 BOOL IPFEC_Hold_Uses = FALSE;
00115 BOOL IPFEC_Enable_Safety_Load = TRUE;
00116 BOOL IPFEC_Enable_Multi_Branch = TRUE;
00117 BOOL IPFEC_Enable_Pre_Multi_Branch = TRUE;
00118 BOOL IPFEC_Enable_Post_Multi_Branch = TRUE;
00119 BOOL IPFEC_Profitability = FALSE;
00120 BOOL IPFEC_Enable_LICM = TRUE;
00121 INT32 IPFEC_sched_care_machine = Sched_care_bundle;
00122 BOOL IPFEC_Enable_Insert_UNAT = TRUE;
00123
00124 BOOL IPFEC_Enable_Split_bb = FALSE;
00125
00126 char * IPFEC_safe_cntl_spec_prob = NULL;
00127 char * IPFEC_unsafe_cntl_spec_prob = NULL;
00128
00129
00130
00131
00132
00133 BOOL ORC_Enable_Region_Formation = TRUE;
00134 BOOL ORC_Enable_Region_Decomposition = TRUE;
00135 INT32 ORC_Enable_Tail_Duplication = FALSE;
00136 INT32 ORC_Enable_Exit_Probability = FALSE;
00137 INT32 ORC_Stacked_Cut_Num = 0;
00138 INT32 ORC_Stacked_Spill_Num = 0;
00139 BOOL ORC_Enable_If_Conversion = TRUE;
00140 BOOL ORC_Force_If_Conv = FALSE;
00141 BOOL ORC_Relaxed_If_Conv = TRUE;
00142 BOOL ORC_Force_Para_Comp_Gen = FALSE;
00143 BOOL ORC_Para_Comp_Gen = TRUE;
00144 BOOL ORC_Combine_Exit = FALSE;
00145 BOOL ORC_Disable_Merge_BB = FALSE;
00146 BOOL ORC_Enable_PRDB= TRUE;
00147 BOOL ORC_Enable_BB_Verify = FALSE;
00148 BOOL ORC_Enable_Prepass_GLOS = TRUE;
00149 BOOL ORC_Enable_Opt_after_schedule = TRUE;
00150 BOOL ORC_Enable_Postpass_GLOS = FALSE;
00151 BOOL ORC_Enable_Prepass_LOCS = FALSE;
00152 BOOL ORC_Enable_Postpass_LOCS = TRUE;
00153 BOOL ORC_Enable_Speculation = TRUE;
00154 BOOL ORC_Enable_Data_Speculation = TRUE;
00155 BOOL ORC_Enable_Cntl_Speculation = TRUE;
00156 BOOL ORC_Enable_FP_Ld_Speculation = TRUE;
00157 BOOL ORC_Enable_Data_Spec_Res_Aware = TRUE;
00158 BOOL ORC_Enable_Compressed_Template = TRUE;
00159
00160 BOOL ORC_Glos_Reg_Pressure_Aware = TRUE;
00161 BOOL ORC_Stress_Spec = FALSE;
00162 BOOL ORC_Glos_Motion_Across_Calls = FALSE ;
00163 BOOL ORC_Glos_Split_Entry_BB = TRUE ;
00164 BOOL ORC_Glos_Split_Exit_BB = TRUE ;
00165 BOOL ORC_Glos_Enable_P_Ready_Code_Motion = TRUE;
00166 BOOL ORC_Glos_Code_Motion_Across_Nested_Rgn = TRUE;
00167 BOOL ORC_Glos_Enable_Cntl_Spec_If_Converted_Code = FALSE;
00168 BOOL ORC_Glos_Enable_Renaming = TRUE;
00169 BOOL ORC_Adjust_Variable_Latency = TRUE ;
00170 BOOL ORC_Enable_Multi_Branch = TRUE;
00171 BOOL ORC_Enable_Pre_Multi_Branch = TRUE;
00172 BOOL ORC_Enable_Post_Multi_Branch = TRUE;
00173 BOOL ORC_Enable_Cache_Analysis = TRUE;
00174
00175
00176 BOOL ORC_Enable_Edge_Profile = FALSE;
00177 BOOL ORC_Enable_Value_Profile = FALSE;
00178 BOOL ORC_Enable_Stride_Profile = FALSE;
00179 BOOL ORC_Enable_Random_Prob = FALSE;
00180 BOOL ORC_Enable_Edge_Profile_Annot = FALSE;
00181
00182 BOOL ORC_Enable_Value_Profile_Annot = FALSE;
00183 BOOL ORC_Enable_Stride_Profile_Annot = FALSE;
00184
00185 INT32 ORC_Enable_Stride_Prefetch = 3;
00186
00187 BOOL ORC_Enable_Pre_Bundling = TRUE;
00188 BOOL ORC_Force_CHK_Fail = FALSE;
00189 BOOL ORC_Chk_Compact = TRUE;
00190 BOOL ORC_Enable_Cascade = TRUE;
00191 BOOL ORC_Hold_Uses = FALSE;
00192 BOOL ORC_Enable_Safety_Load = TRUE;
00193 BOOL ORC_Profitability = FALSE;
00194 INT32 ORC_sched_care_machine = Sched_care_bundle;
00195 BOOL ORC_Enable_Insert_UNAT = TRUE;
00196
00197 BOOL ORC_Enable_Split_bb = FALSE;
00198 BOOL ORC_Enable_LICM = TRUE;
00199
00200 char * ORC_safe_cntl_spec_prob = NULL;
00201 char * ORC_unsafe_cntl_spec_prob = NULL;
00202
00203
00204
00205 BOOL VT_Enable_BB_OP = FALSE;
00206 BOOL VT_Enable_Global_CFG = FALSE;
00207 BOOL VT_Enable_Regional_CFG = FALSE;
00208 BOOL VT_Enable_Region_Tree = FALSE;
00209 BOOL VT_Enable_BB_DAG = FALSE;
00210 BOOL VT_Enable_Regional_DAG = FALSE;
00211 BOOL VT_Enable_Partition_Graph = FALSE;
00212 BOOL VT_Enable_CFG_Label = FALSE;
00213 BOOL VT_Enable_DAG_BR = FALSE;
00214
00215
00216 OPTION_LIST *raw_locs_skip_bb;
00217 SKIPLIST *locs_skip_bb;
00218 OPTION_LIST *raw_mlbr_skip_bb;
00219 SKIPLIST *mlbr_skip_bb;
00220
00221 OPTION_LIST *raw_if_conv_skip_rgn;
00222 SKIPLIST *if_conv_skip_rgn;
00223 OPTION_LIST *raw_if_conv_skip_area;
00224 SKIPLIST *if_conv_skip_area;
00225
00226 OPTION_LIST *raw_glos_skip_rgn;
00227 SKIPLIST *glos_skip_rgn;
00228 OPTION_LIST *raw_glos_skip_bb;
00229 SKIPLIST *glos_skip_bb;
00230 OPTION_LIST *raw_glos_skip_op;
00231 SKIPLIST *glos_skip_op;
00232
00233
00234 OPTION_LIST *raw_spec_skip_bb;
00235 SKIPLIST *spec_skip_bb;
00236 OPTION_LIST *raw_spec_skip_rgn;
00237 SKIPLIST *spec_skip_rgn;
00238 OPTION_LIST *raw_spec_skip_op;
00239 SKIPLIST *spec_skip_op;
00240
00241 OPTION_LIST *raw_msched_skip_bb;
00242 SKIPLIST *msched_skip_bb;
00243 OPTION_LIST *raw_msched_skip_rgn;
00244 SKIPLIST *msched_skip_rgn;
00245
00246 OPTION_LIST *raw_spec_skip_PU;
00247 SKIPLIST *spec_skip_PU;
00248 OPTION_LIST *raw_if_conv_skip_PU;
00249 SKIPLIST *if_conv_skip_PU;
00250 OPTION_LIST *raw_pre_glos_skip_PU;
00251 SKIPLIST *pre_glos_skip_PU;
00252 OPTION_LIST *raw_post_locs_skip_PU;
00253 SKIPLIST *post_locs_skip_PU;
00254 OPTION_LIST *raw_PRDB_skip_PU;
00255 SKIPLIST *PRDB_skip_PU;
00256
00257 OPTION_LIST *raw_glos_rename_skip_bb;
00258 SKIPLIST *glos_rename_skip_bb;
00259 OPTION_LIST *raw_glos_rename_skip_op;
00260 SKIPLIST *glos_rename_skip_op;
00261
00262
00263 OPTION_LIST *raw_latency2;
00264 SKIPLIST *latency2;
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 void
00276 Copy_Ipfec_Flags (void) {
00277
00278 IPFEC_Enable_Region_Formation = ORC_Enable_Region_Formation;
00279 IPFEC_Enable_Region_Decomposition = ORC_Enable_Region_Decomposition;
00280 IPFEC_Enable_Tail_Duplication = ORC_Enable_Tail_Duplication;
00281 IPFEC_Enable_Exit_Probability = ORC_Enable_Exit_Probability;
00282 IPFEC_Stacked_Cut_Num = ORC_Stacked_Cut_Num;
00283 IPFEC_Stacked_Spill_Num = ORC_Stacked_Spill_Num;
00284 IPFEC_Enable_If_Conversion = ORC_Enable_If_Conversion;
00285 IPFEC_Force_If_Conv = ORC_Force_If_Conv;
00286 IPFEC_Relaxed_If_Conv = ORC_Relaxed_If_Conv;
00287 IPFEC_Force_Para_Comp_Gen = ORC_Force_Para_Comp_Gen;
00288 IPFEC_Para_Comp_Gen = ORC_Para_Comp_Gen;
00289 IPFEC_Combine_Exit = ORC_Combine_Exit;
00290 IPFEC_Disable_Merge_BB = ORC_Disable_Merge_BB;
00291 IPFEC_Enable_PRDB = ORC_Enable_PRDB;
00292 IPFEC_Enable_BB_Verify = ORC_Enable_BB_Verify;
00293 IPFEC_Enable_Prepass_GLOS = ORC_Enable_Prepass_GLOS;
00294 IPFEC_Enable_Opt_after_schedule = ORC_Enable_Opt_after_schedule;
00295 IPFEC_Enable_Postpass_GLOS = ORC_Enable_Postpass_GLOS;
00296 IPFEC_Enable_Prepass_LOCS = ORC_Enable_Prepass_LOCS;
00297 IPFEC_Enable_Postpass_LOCS = ORC_Enable_Postpass_LOCS;
00298 IPFEC_Enable_Speculation = ORC_Enable_Speculation;
00299 IPFEC_Enable_FP_Ld_Speculation = ORC_Enable_FP_Ld_Speculation;
00300 IPFEC_Enable_Data_Spec_Res_Aware = ORC_Enable_Data_Spec_Res_Aware;
00301 IPFEC_Enable_Data_Speculation = ORC_Enable_Data_Speculation;
00302 IPFEC_Enable_Cntl_Speculation = ORC_Enable_Cntl_Speculation;
00303 IPFEC_Enable_Compressed_Template = ORC_Enable_Compressed_Template;
00304 IPFEC_safe_cntl_spec_prob = ORC_safe_cntl_spec_prob;
00305 IPFEC_unsafe_cntl_spec_prob = ORC_unsafe_cntl_spec_prob;
00306
00307 IPFEC_Glos_Reg_Pressure_Aware = ORC_Glos_Reg_Pressure_Aware;
00308 IPFEC_Stress_Spec = ORC_Stress_Spec;
00309 IPFEC_Glos_Motion_Across_Calls = ORC_Glos_Motion_Across_Calls;
00310 IPFEC_Glos_Split_Entry_BB = ORC_Glos_Split_Entry_BB ;
00311 IPFEC_Glos_Split_Exit_BB = ORC_Glos_Split_Exit_BB ;
00312 IPFEC_Glos_Enable_P_Ready_Code_Motion = ORC_Glos_Enable_P_Ready_Code_Motion ;
00313 IPFEC_Glos_Code_Motion_Across_Nested_Rgn = ORC_Glos_Code_Motion_Across_Nested_Rgn;
00314 IPFEC_Glos_Enable_Cntl_Spec_If_Converted_Code = ORC_Glos_Enable_Cntl_Spec_If_Converted_Code;
00315 IPFEC_Glos_Enable_Renaming = ORC_Glos_Enable_Renaming;
00316 IPFEC_Adjust_Variable_Latency = ORC_Adjust_Variable_Latency ;
00317 IPFEC_Enable_Multi_Branch =ORC_Enable_Multi_Branch ;
00318 IPFEC_Enable_Pre_Multi_Branch = ORC_Enable_Pre_Multi_Branch;
00319 IPFEC_Enable_Post_Multi_Branch = ORC_Enable_Post_Multi_Branch ;
00320
00321 IPFEC_Enable_Edge_Profile = ORC_Enable_Edge_Profile;
00322 IPFEC_Enable_Value_Profile = ORC_Enable_Value_Profile;
00323 IPFEC_Enable_Stride_Profile = ORC_Enable_Stride_Profile;
00324 IPFEC_Enable_Random_Prob = ORC_Enable_Random_Prob;
00325 IPFEC_Enable_Edge_Profile_Annot = ORC_Enable_Edge_Profile_Annot;
00326
00327 IPFEC_Enable_Value_Profile_Annot = ORC_Enable_Value_Profile_Annot;
00328 IPFEC_Enable_Stride_Profile_Annot = ORC_Enable_Stride_Profile_Annot;
00329 IPFEC_Enable_Pre_Bundling = ORC_Enable_Pre_Bundling;
00330 IPFEC_Force_CHK_Fail = ORC_Force_CHK_Fail;
00331 IPFEC_Chk_Compact = ORC_Chk_Compact;
00332 IPFEC_Enable_Cascade = ORC_Enable_Cascade;
00333 IPFEC_Hold_Uses = ORC_Hold_Uses;
00334 IPFEC_Enable_Safety_Load = ORC_Enable_Safety_Load;
00335 IPFEC_Profitability = ORC_Profitability;
00336 IPFEC_sched_care_machine = ORC_sched_care_machine;
00337 IPFEC_Enable_Insert_UNAT = ORC_Enable_Insert_UNAT;
00338 IPFEC_Enable_Stride_Prefetch =ORC_Enable_Stride_Prefetch;
00339
00340 IPFEC_Enable_Split_bb = ORC_Enable_Split_bb;
00341 IPFEC_Enable_LICM = ORC_Enable_LICM;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 void
00353 IPFEC_Print_Skiplist ( SKIPLIST *skip, char *lab, FILE *tf=stderr )
00354 {
00355 INT32 i;
00356
00357 if ( skip == NULL ) {
00358 fprintf ( tf, "SKIPLIST %s empty\n", lab );
00359 return;
00360 }
00361 fprintf ( tf, "SKIPLIST %s:\n", lab );
00362
00363 for ( i = 0; skip->SKIPLIST_kind(i) != SK_NONE; i++ ) {
00364 switch ( skip->SKIPLIST_kind(i) ) {
00365 case SK_EQUAL:
00366 fprintf ( tf, " equal %d\n", skip->SKIPLIST_val(i) );
00367 break;
00368 case SK_AFTER:
00369 fprintf ( tf, " after %d\n", skip->SKIPLIST_val(i) );
00370 break;
00371 case SK_BEFORE:
00372 fprintf ( tf, " before %d\n", skip->SKIPLIST_val(i) );
00373 break;
00374 }
00375 }
00376 fprintf ( tf, "SKIPLIST %s end\n\n", lab );
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402 SKIPLIST *
00403 IPFEC_Build_Skiplist ( OPTION_LIST *olist )
00404 {
00405 UINT count = 0;
00406 OPTION_LIST *ol;
00407 SKIPLIST *sl = CXX_NEW(SKIPLIST(), &MEM_pu_pool);
00408 BOOL list_found = FALSE;
00409 BOOL set_first = TRUE;
00410 BOOL global_skip = TRUE;
00411 char *p;
00412
00413
00414 if ( olist == NULL ) return NULL;
00415 for ( ol = olist; ol != NULL; ol = OLIST_next(ol) ) {
00416
00417
00418 ++count;
00419
00420
00421 p = OLIST_val(ol);
00422 while ( *p != ':' && *p != 0 ) {
00423
00424
00425 if ( *p == '%' ||*p == '-' || *p == '^' || *p=='#' ) {
00426 if( *p == '%') {
00427 Set_SL_local(sl);
00428 global_skip = FALSE;
00429 }
00430 ++count;
00431 list_found = TRUE;
00432 }
00433 ++p;
00434 }
00435 }
00436
00437
00438 sl->SKIPLIST_size() = count+1;
00439 sl->SKIPLIST_kind_vec() = (mINT8 *) calloc ( sizeof(mINT8), count+1 );
00440 sl->SKIPLIST_val_vec() = (mINT32 *) calloc ( sizeof(mINT32), count+1 );
00441 Set_SL_global(sl);
00442
00443 for ( count = 0, ol = olist;
00444 ol != NULL;
00445 ++count, ol = OLIST_next(ol) )
00446 {
00447 if ( strstr(OLIST_opt(ol)+strlen(OLIST_opt(ol))-6, "_after" ) ||
00448 strstr(OLIST_opt(ol)+strlen(OLIST_opt(ol))-2, "_a" ) ) {
00449 sl->Set_SKIPLIST_kind ( count, SK_AFTER );
00450 }
00451 else if ( strstr(OLIST_opt(ol)+strlen(OLIST_opt(ol))-7, "_before" ) ||
00452 strstr(OLIST_opt(ol)+strlen(OLIST_opt(ol))-2,"_b" )) {
00453 sl->Set_SKIPLIST_kind ( count, SK_BEFORE );
00454 } else {
00455 sl->Set_SKIPLIST_kind ( count, SK_EQUAL );
00456 }
00457
00458 if( set_first ) {
00459 sl->SKIPLIST_val(count) = atoi ( OLIST_val(ol) );
00460 set_first = FALSE;
00461 }
00462 else
00463 sl->SKIPLIST_val(count) = -1*atoi( OLIST_val(ol) ) - 1;
00464
00465 if (global_skip) {
00466 set_first = TRUE;
00467 }
00468
00469 if ( list_found && sl->SKIPLIST_kind(count) == SK_EQUAL ) {
00470 p = OLIST_val(ol);
00471
00472
00473 while ( *p >= '0' && *p <= '9' ) ++p;
00474
00475 if ( *p == '-' ) {
00476 sl->Set_SKIPLIST_kind ( count, SK_AFTER );
00477 sl->SKIPLIST_val(count) --;
00478 ++p;
00479 ++count;
00480 sl->Set_SKIPLIST_kind ( count, SK_BEFORE );
00481 sl->SKIPLIST_val(count) = 1 + atoi ( p );
00482 while ( *p >= '0' && *p <= '9' ) ++p;
00483 }
00484 if (*p == '%') {
00485 while ( *p++ == '%' ) {
00486 ++count;
00487 sl->Set_SKIPLIST_kind ( count, SK_EQUAL );
00488 sl->SKIPLIST_val(count) = atoi ( p );
00489 while ( *p >= '0' && *p <= '9' ) ++p;
00490 if ( *p == '-' ) {
00491 sl->Set_SKIPLIST_kind ( count, SK_AFTER );
00492 sl->SKIPLIST_val(count) --;
00493 ++p;
00494 ++count;
00495 sl->Set_SKIPLIST_kind ( count, SK_BEFORE );
00496 sl->SKIPLIST_val(count) = 1 + atoi ( p );
00497 while ( *p >= '0' && *p <= '9' ) ++p;
00498 }
00499 if ( *p == '^' ) {
00500 p++;
00501 ++count;
00502 sl->Set_SKIPLIST_kind ( count, SK_EQUAL);
00503
00504
00505 sl->SKIPLIST_val(count) = -1*atoi( p ) - 1;
00506 while ( *p >= '0' && *p <= '9' ) ++p;
00507 }
00508 }
00509 }
00510 if(*p == '#') {
00511 while (*p++ == '#') {
00512 ++count;
00513 sl->Set_SKIPLIST_kind ( count, SK_EQUAL );
00514 sl->SKIPLIST_val(count) = atoi ( p );
00515
00516 while ( *p >= '0' && *p <= '9' ) ++p;
00517
00518 if ( *p == '-' ) {
00519 sl->Set_SKIPLIST_kind ( count, SK_AFTER );
00520 sl->SKIPLIST_val(count) --;
00521 ++p;
00522 ++count;
00523 sl->Set_SKIPLIST_kind ( count, SK_BEFORE );
00524 sl->SKIPLIST_val(count) = 1 + atoi ( p );
00525 while ( *p >= '0' && *p <= '9' ) ++p;
00526 }
00527 }
00528 }
00529
00530
00531 } else if(list_found){
00532 SKIPKIND field_kind = (SKIPKIND)sl->SKIPLIST_kind(count);
00533 p = OLIST_val(ol);
00534 while ( *p >= '0' && *p <= '9' ) ++p;
00535
00536 while ( *p++ == '%' ) {
00537 ++count;
00538
00539 sl->Set_SKIPLIST_kind ( count, field_kind );
00540 sl->SKIPLIST_val(count) = atoi ( p );
00541 while ( *p >= '0' && *p <= '9' ) ++p;
00542 if ( *p == '^' ) {
00543 p++;
00544 ++count;
00545 sl->Set_SKIPLIST_kind ( count, field_kind);
00546
00547
00548 sl->SKIPLIST_val(count) = -1*atoi( p ) - 1;
00549 while ( *p >= '0' && *p <= '9' ) ++p;
00550 }
00551 }
00552 }
00553 }
00554
00555
00556 sl->Set_SKIPLIST_kind ( count, SK_NONE );
00557
00558 if ( Get_Trace ( TP_MISC, 0x80 ) ) {
00559 IPFEC_Print_Skiplist ( sl, "Build_Skiplist", TFile );
00560 }
00561
00562 return sl;
00563 }
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585 BOOL
00586 IPFEC_Query_Skiplist ( SKIPLIST *skip, INT32 elmt, INT32 field )
00587 {
00588 INT32 i;
00589 BOOL ok;
00590 INT32 field_id;
00591
00592 if ( skip == NULL ) return FALSE;
00593
00594 if (!SL_local(skip))
00595 field = -1;
00596
00597
00598 if ( field >=0 )
00599 i = 1;
00600 else
00601 i = 0;
00602 for ( ; skip->SKIPLIST_kind(i) != SK_NONE; i++ ) {
00603 switch ( skip->SKIPLIST_kind(i) ) {
00604
00605 case SK_EQUAL:
00606 if ( skip->SKIPLIST_val(i) == elmt ) {
00607 if ( field >= 0 ) {
00608
00609 field_id = i;
00610 while(!(skip->SKIPLIST_val(field_id) < 0 || field_id == 0) )
00611 field_id--;
00612
00613 if ( field_id == 0) {
00614 if( skip->SKIPLIST_val(field_id) == field )
00615 return TRUE;
00616 }
00617 else {
00618 if ( -1*skip->SKIPLIST_val(field_id)-1 == field )
00619 return TRUE;
00620 }
00621
00622 }
00623 else return TRUE;
00624 }
00625
00626 break;
00627
00628 case SK_AFTER:
00629 if(skip->SKIPLIST_val(i) < 0)
00630 break;
00631
00632 ok = ( skip->SKIPLIST_val(i) < elmt );
00633 if ( skip->SKIPLIST_kind(i+1) == SK_BEFORE
00634 && skip->SKIPLIST_val(i+1) > skip->SKIPLIST_val(i))
00635 {
00636 if ( skip->SKIPLIST_val(++i) <= elmt ) ok = FALSE;
00637 }
00638
00639 if ( ok ) {
00640 if ( field >= 0 ) {
00641 field_id = i;
00642 while(!(skip->SKIPLIST_val(field_id) < 0 || field_id == 0) )
00643 field_id--;
00644
00645 if ( field_id == 0) {
00646 if( skip->SKIPLIST_val(field_id) == field )
00647 return TRUE;
00648 }
00649 else {
00650 if ( -1*skip->SKIPLIST_val(field_id)-1 == field )
00651 return TRUE;
00652 }
00653 }
00654 else {
00655 return TRUE;
00656 }
00657 }
00658
00659 break;
00660
00661 case SK_BEFORE:
00662 if(skip->SKIPLIST_val(i) < 0)
00663 break;
00664 ok = (skip->SKIPLIST_val(i) > elmt ) ;
00665 if ( ok ) {
00666 if ( field >= 0 ) {
00667 field_id = i;
00668 while(!(skip->SKIPLIST_val(field_id) < 0 || field_id == 0) )
00669 field_id--;
00670
00671 if ( field_id == 0) {
00672 if( skip->SKIPLIST_val(field_id) == field )
00673 return TRUE;
00674 }
00675 else {
00676 if ( -1*skip->SKIPLIST_val(field_id)-1 == field )
00677 return TRUE;
00678 }
00679 }
00680 else return TRUE;
00681 }
00682
00683 break;
00684
00685 default:
00686
00687 break;
00688 }
00689 }
00690
00691 return FALSE;
00692 }