Changeset 1904 for trunk/src/kmk/strcache2.c
- Timestamp:
- Oct 21, 2008, 6:46:23 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/strcache2.c
r1903 r1904 277 277 strcache2_memcmp_inline_short (const char *xs, const char *ys, unsigned int length) 278 278 { 279 /* short string compare - ~50% of the kBuild calls. */ 280 assert ( !((size_t)ys & 3) ); 281 if (!((size_t)xs & 3)) 282 { 283 /* aligned */ 284 int result; 285 switch (length) 286 { 287 case 8: 288 result = *(int32_t*)(xs + 4) - *(int32_t*)(ys + 4); 289 result |= *(int32_t*)xs - *(int32_t*)ys; 290 return result; 291 case 7: 292 result = xs[6] - ys[6]; 293 result |= xs[5] - ys[5]; 294 result |= xs[4] - ys[4]; 295 result |= *(int32_t*)xs - *(int32_t*)ys; 296 return result; 297 case 6: 298 result = xs[5] - ys[5]; 299 result |= xs[4] - ys[4]; 300 result |= *(int32_t*)xs - *(int32_t*)ys; 301 return result; 302 case 5: 303 result = xs[4] - ys[4]; 304 result |= *(int32_t*)xs - *(int32_t*)ys; 305 return result; 306 case 4: 307 return *(int32_t*)xs - *(int32_t*)ys; 308 case 3: 309 result = xs[2] - ys[2]; 310 result |= xs[1] - ys[1]; 311 result |= xs[0] - ys[0]; 312 return result; 313 case 2: 314 result = xs[1] - ys[1]; 315 result |= xs[0] - ys[0]; 316 return result; 317 case 1: 318 return *xs - *ys; 319 case 0: 320 return 0; 321 } 322 } 323 else 324 { 325 /* unaligned */ 326 int result = 0; 327 switch (length) 328 { 329 case 8: result |= xs[7] - ys[7]; 330 case 7: result |= xs[6] - ys[6]; 331 case 6: result |= xs[5] - ys[5]; 332 case 5: result |= xs[4] - ys[4]; 333 case 4: result |= xs[3] - ys[3]; 334 case 3: result |= xs[2] - ys[2]; 335 case 2: result |= xs[1] - ys[1]; 336 case 1: result |= xs[0] - ys[0]; 337 case 0: 338 return result; 279 if (length <= 8) 280 { 281 /* short string compare - ~50% of the kBuild calls. */ 282 assert ( !((size_t)ys & 3) ); 283 if (!((size_t)xs & 3)) 284 { 285 /* aligned */ 286 int result; 287 switch (length) 288 { 289 default: /* memcmp for longer strings */ 290 return memcmp (xs, ys, length); 291 case 8: 292 result = *(int32_t*)(xs + 4) - *(int32_t*)(ys + 4); 293 result |= *(int32_t*)xs - *(int32_t*)ys; 294 return result; 295 case 7: 296 result = xs[6] - ys[6]; 297 result |= xs[5] - ys[5]; 298 result |= xs[4] - ys[4]; 299 result |= *(int32_t*)xs - *(int32_t*)ys; 300 return result; 301 case 6: 302 result = xs[5] - ys[5]; 303 result |= xs[4] - ys[4]; 304 result |= *(int32_t*)xs - *(int32_t*)ys; 305 return result; 306 case 5: 307 result = xs[4] - ys[4]; 308 result |= *(int32_t*)xs - *(int32_t*)ys; 309 return result; 310 case 4: 311 return *(int32_t*)xs - *(int32_t*)ys; 312 case 3: 313 result = xs[2] - ys[2]; 314 result |= xs[1] - ys[1]; 315 result |= xs[0] - ys[0]; 316 return result; 317 case 2: 318 result = xs[1] - ys[1]; 319 result |= xs[0] - ys[0]; 320 return result; 321 case 1: 322 return *xs - *ys; 323 case 0: 324 return 0; 325 } 326 } 327 else 328 { 329 /* unaligned */ 330 int result = 0; 331 switch (length) 332 { 333 case 8: result |= xs[7] - ys[7]; 334 case 7: result |= xs[6] - ys[6]; 335 case 6: result |= xs[5] - ys[5]; 336 case 5: result |= xs[4] - ys[4]; 337 case 4: result |= xs[3] - ys[3]; 338 case 3: result |= xs[2] - ys[2]; 339 case 2: result |= xs[1] - ys[1]; 340 case 1: result |= xs[0] - ys[0]; 341 case 0: 342 return result; 343 } 339 344 } 340 345 } 341 346 342 347 /* memcmp for longer strings */ 343 # ifdef __GNUC__344 return __builtin_memcmp (xs, ys, length);345 # else346 348 return memcmp (xs, ys, length); 347 # endif348 349 } 349 350 … … 466 467 return 0; 467 468 468 #if 1469 #if 0 469 470 return memcmp (entry + 1, str, length) == 0; 470 #elif 0471 return strcache2_memcmp_inlined ( entry + 1, str, length) == 0;471 #elif 1 472 return strcache2_memcmp_inlined ((const char *)(entry + 1), str, length) == 0; 472 473 #else 473 return strcache2_memcmp_inline_short ( entry + 1, str, length) == 0;474 return strcache2_memcmp_inline_short ((const char *)(entry + 1), str, length) == 0; 474 475 #endif 475 476 }
Note:
See TracChangeset
for help on using the changeset viewer.