Changeset 1822


Ignore:
Timestamp:
Oct 10, 2008, 10:27:37 PM (16 years ago)
Author:
bird
Message:

inlined_memchr: hacked up a 8-byte loop unroll, doesn't by much/anything over the four byte one though so it's disabled.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/kmk/inlined_memchr.h

    r1816 r1822  
    11#include <string.h>
     2
    23#ifdef _MSC_VER
    34_inline void *
     
    910    register const unsigned int   uch = (unsigned)ch;
    1011    register const unsigned char *pb = (const unsigned char *)pv;
    11 #if 1
     12#if 0 /* 8-byte loop unroll */
     13    while (cb >= 8)
     14    {
     15        if (*pb == uch)
     16            return (unsigned char *)pb;
     17        if (pb[1] == uch)
     18            return (unsigned char *)pb + 1;
     19        if (pb[2] == uch)
     20            return (unsigned char *)pb + 2;
     21        if (pb[3] == uch)
     22            return (unsigned char *)pb + 3;
     23        if (pb[4] == uch)
     24            return (unsigned char *)pb + 4;
     25        if (pb[5] == uch)
     26            return (unsigned char *)pb + 5;
     27        if (pb[6] == uch)
     28            return (unsigned char *)pb + 6;
     29        if (pb[7] == uch)
     30            return (unsigned char *)pb + 7;
     31        cb -= 8;
     32        pb += 8;
     33    }
     34    switch (cb & 7)
     35    {
     36        case 0:
     37            break;
     38        case 1:
     39            if (*pb == uch)
     40                return (unsigned char *)pb;
     41            break;
     42        case 2:
     43            if (*pb == uch)
     44                return (unsigned char *)pb;
     45            if (pb[1] == uch)
     46                return (unsigned char *)pb + 1;
     47            break;
     48        case 3:
     49            if (*pb == uch)
     50                return (unsigned char *)pb;
     51            if (pb[1] == uch)
     52                return (unsigned char *)pb + 1;
     53            if (pb[2] == uch)
     54                return (unsigned char *)pb + 2;
     55            break;
     56        case 4:
     57            if (*pb == uch)
     58                return (unsigned char *)pb;
     59            if (pb[1] == uch)
     60                return (unsigned char *)pb + 1;
     61            if (pb[2] == uch)
     62                return (unsigned char *)pb + 2;
     63            if (pb[3] == uch)
     64                return (unsigned char *)pb + 3;
     65            break;
     66        case 5:
     67            if (*pb == uch)
     68                return (unsigned char *)pb;
     69            if (pb[1] == uch)
     70                return (unsigned char *)pb + 1;
     71            if (pb[2] == uch)
     72                return (unsigned char *)pb + 2;
     73            if (pb[3] == uch)
     74                return (unsigned char *)pb + 3;
     75            if (pb[4] == uch)
     76                return (unsigned char *)pb + 4;
     77            break;
     78        case 6:
     79            if (*pb == uch)
     80                return (unsigned char *)pb;
     81            if (pb[1] == uch)
     82                return (unsigned char *)pb + 1;
     83            if (pb[2] == uch)
     84                return (unsigned char *)pb + 2;
     85            if (pb[3] == uch)
     86                return (unsigned char *)pb + 3;
     87            if (pb[4] == uch)
     88                return (unsigned char *)pb + 4;
     89            if (pb[5] == uch)
     90                return (unsigned char *)pb + 5;
     91            break;
     92        case 7:
     93            if (*pb == uch)
     94                return (unsigned char *)pb;
     95            if (pb[1] == uch)
     96                return (unsigned char *)pb + 1;
     97            if (pb[2] == uch)
     98                return (unsigned char *)pb + 2;
     99            if (pb[3] == uch)
     100                return (unsigned char *)pb + 3;
     101            if (pb[4] == uch)
     102                return (unsigned char *)pb + 4;
     103            if (pb[5] == uch)
     104                return (unsigned char *)pb + 5;
     105            if (pb[6] == uch)
     106                return (unsigned char *)pb + 6;
     107            break;
     108    }
     109
     110#elif 1 /* 4 byte loop unroll */
    12111    while (cb >= 4)
    13112    {
     
    47146    }
    48147
    49 #else
     148#else /* the basic loop */
    50149    while (cb > 0)
    51150    {
Note: See TracChangeset for help on using the changeset viewer.