Ignore:
Timestamp:
Oct 21, 2008, 6:46:23 AM (17 years ago)
Author:
bird
Message:

strcache2: inline memcmp seems faster (weird).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/strcache2.c

    r1903 r1904  
    277277strcache2_memcmp_inline_short (const char *xs, const char *ys, unsigned int length)
    278278{
    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            }
    339344        }
    340345    }
    341346
    342347  /* memcmp for longer strings */
    343 # ifdef __GNUC__
    344   return __builtin_memcmp (xs, ys, length);
    345 # else
    346348  return memcmp (xs, ys, length);
    347 # endif
    348349}
    349350
     
    466467      return 0;
    467468
    468 #if 1
     469#if 0
    469470  return memcmp (entry + 1, str, length) == 0;
    470 #elif 0
    471   return strcache2_memcmp_inlined (entry + 1, str, length) == 0;
     471#elif 1
     472  return strcache2_memcmp_inlined ((const char *)(entry + 1), str, length) == 0;
    472473#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;
    474475#endif
    475476}
Note: See TracChangeset for help on using the changeset viewer.