FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
memchrSSE2.h
Go to the documentation of this file.
1 #ifndef _MEMCHR_SSE2_H_
2 #define _MEMCHR_SSE2_H_ "$Id: memchrSSE2.h 316 2020-03-26 16:18:40Z geoff $"
4 
6 /*
7  fast memchr and strlen using SSE2 for gcc 4.x / Visual Studio 2008(32bit/64bit)
8 
9  Copyright (C) 2008 MITSUNARI Shigeo at Cybozu Labs, Inc.
10  license:new BSD license
11 */
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <assert.h>
19 #include <memory.h>
20 #include <vector>
21 
22 #ifdef _WIN32
23  #include <intrin.h>
24  #define _memchr_bsf(x) (_BitScanForward(&x, x), x)
25 #else
26  #include <xmmintrin.h>
27  #define _memchr_bsf(x) __builtin_ctz(x)
28 #endif
29 
30 inline void *memchrSSE2(const void *ptr, int c, size_t len)
31 {
32  const char *p = reinterpret_cast<const char*>(ptr);
33  if (len >= 16) {
34  __m128i c16 = _mm_set1_epi8(static_cast<char>(c));
35  /* 16 byte alignment */
36  size_t ip = reinterpret_cast<size_t>(p);
37  size_t n = ip & 15;
38  if (n > 0) {
39  ip &= ~15;
40  __m128i x = *(const __m128i*)ip;
41  __m128i a = _mm_cmpeq_epi8(x, c16);
42  unsigned long mask = _mm_movemask_epi8(a);
43  mask &= 0xffffffffUL << n;
44  if (mask) {
45  return (void*)(ip + _memchr_bsf(mask));
46  }
47  n = 16 - n;
48  len -= n;
49  p += n;
50  }
51  while (len >= 32) {
52  __m128i x = *(const __m128i*)&p[0];
53  __m128i y = *(const __m128i*)&p[16];
54  __m128i a = _mm_cmpeq_epi8(x, c16);
55  __m128i b = _mm_cmpeq_epi8(y, c16);
56  unsigned long mask = (_mm_movemask_epi8(b) << 16) | _mm_movemask_epi8(a);
57  if (mask) {
58  return (void*)(p + _memchr_bsf(mask));
59  }
60  len -= 32;
61  p += 32;
62  }
63  }
64  while (len > 0) {
65  if (*p == c) return (void*)p;
66  p++;
67  len--;
68  }
69  return 0;
70 }
71 
72 inline size_t strlenSSE2(const char *p)
73 {
74  const char *const top = p;
75  __m128i c16 = _mm_set1_epi8(0);
76  /* 16 byte alignment */
77  size_t ip = reinterpret_cast<size_t>(p);
78  size_t n = ip & 15;
79  if (n > 0) {
80  ip &= ~15;
81  __m128i x = *(const __m128i*)ip;
82  __m128i a = _mm_cmpeq_epi8(x, c16);
83  unsigned long mask = _mm_movemask_epi8(a);
84  mask &= 0xffffffffUL << n;
85  if (mask) {
86  return _memchr_bsf(mask) - n;
87  }
88  p += 16 - n;
89  }
90  /*
91  thanks to egtra-san
92  */
93  assert((reinterpret_cast<size_t>(p) & 15) == 0);
94  if (reinterpret_cast<size_t>(p) & 31) {
95  __m128i x = *(const __m128i*)&p[0];
96  __m128i a = _mm_cmpeq_epi8(x, c16);
97  unsigned long mask = _mm_movemask_epi8(a);
98  if (mask) {
99  return p + _memchr_bsf(mask) - top;
100  }
101  p += 16;
102  }
103  assert((reinterpret_cast<size_t>(p) & 31) == 0);
104  for (;;) {
105  __m128i x = *(const __m128i*)&p[0];
106  __m128i y = *(const __m128i*)&p[16];
107  __m128i a = _mm_cmpeq_epi8(x, c16);
108  __m128i b = _mm_cmpeq_epi8(y, c16);
109  unsigned long mask = (_mm_movemask_epi8(b) << 16) | _mm_movemask_epi8(a);
110  if (mask) {
111  return p + _memchr_bsf(mask) - top;
112  }
113  p += 32;
114  }
115 }
116 
117 /* macro unneeded from this point onwards */
118 #undef _memchr_bsf
119 
120 #endif
121 /* vim: set expandtab shiftwidth=4 tabstop=4: */
strlenSSE2
size_t strlenSSE2(const char *p)
Definition: memchrSSE2.h:72
main
int main(int argc, argv)
Definition: mddriver.c:77
_memchr_bsf
#define _memchr_bsf(x)
Definition: memchrSSE2.h:27
md5global.h
buffer
long buffer[MAXDLBUF]
Definition: ethers.c:42
MD
#define MD
Definition: mddriver.c:20
MDUpdate
#define MDUpdate
Definition: mddriver.c:64
MDFinal
#define MDFinal
Definition: mddriver.c:65
MD_CTX
#define MD_CTX
Definition: mddriver.c:62
MDInit
#define MDInit
Definition: mddriver.c:63
memchrSSE2
void * memchrSSE2(const void *ptr, int c, size_t len)
Definition: memchrSSE2.h:30
NULL
#define NULL
Definition: tmp.o.cpp:327
md5.h
stdin
#define stdin
Definition: tmp.o.cpp:3116
TEST_BLOCK_LEN
#define TEST_BLOCK_LEN
Definition: mddriver.c:39
TEST_BLOCK_COUNT
#define TEST_BLOCK_COUNT
Definition: mddriver.c:40
PROTO_LIST
#define PROTO_LIST(list)
Definition: md5global.h:29
assert
#define assert(e)
Definition: tmp.o.cpp:3086
Generated: Fri Jul 31 2020 18:19:14
Support Information