VirtualBox

Changeset 1810 in kBuild for trunk


Ignore:
Timestamp:
Oct 10, 2008 5:19:30 AM (16 years ago)
Author:
bird
Message:

kmk: inline memchr on MSC + AMD64 because the CRT memchr sucks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/config.h.win

    r968 r1810  
    525525#define BATCH_MODE_ONLY_SHELL
    526526
     527#if defined(_M_X64)
     528#include <string.h>
     529static void *
     530my_inline_memchr(const void *pv, int ch, register size_t cb)
     531{
     532    register const unsigned int   uch = (unsigned)ch;
     533    register const unsigned char *pb = (const unsigned char *)pv;
     534#if 1 /* this one beats the CRT (on 2nd gen AMD64). */
     535    while (cb >= 4)
     536    {
     537        if (*pb == uch)
     538            return (unsigned char *)pb;
     539        if (pb[1] == uch)
     540            return (unsigned char *)pb + 1;
     541        if (pb[2] == uch)
     542            return (unsigned char *)pb + 2;
     543        if (pb[3] == uch)
     544            return (unsigned char *)pb + 3;
     545        cb -= 4;
     546        pb += 4;
     547    }
     548    switch (cb & 3)
     549    {
     550        case 0:
     551            break;
     552        case 1:
     553            if (*pb == uch)
     554                return (unsigned char *)pb;
     555            break;
     556        case 2:
     557            if (*pb == uch)
     558                return (unsigned char *)pb;
     559            if (pb[1] == uch)
     560                return (unsigned char *)pb + 1;
     561            break;
     562        case 3:
     563            if (*pb == uch)
     564                return (unsigned char *)pb;
     565            if (pb[1] == uch)
     566                return (unsigned char *)pb + 1;
     567            if (pb[2] == uch)
     568                return (unsigned char *)pb + 2;
     569            break;
     570    }
     571
     572#else /* This is just as good the CRT one. */
     573    while (cb > 0)
     574    {
     575        if (*pb == uch)
     576            return (void *)pb;
     577        cb--;
     578        pb++;
     579    }
     580#endif
     581    return 0;
     582}
     583#define memchr my_inline_memchr
     584#endif
     585
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette