mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
Core: memeq8len
This commit is contained in:
parent
655233f338
commit
fb1deb732f
6 changed files with 165 additions and 0 deletions
49
autotest/memeq8len/memeq8len.cpp
Normal file
49
autotest/memeq8len/memeq8len.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
#include <Core/Core.h>
|
||||
|
||||
using namespace Upp;
|
||||
|
||||
size_t memeq8len_e(const void *p, const void *q, size_t count)
|
||||
{
|
||||
const byte *t = (byte *)p;
|
||||
const byte *t0 = t;
|
||||
const byte *s = (byte *)q;
|
||||
const byte *et = t0 + count;
|
||||
|
||||
while(t < et) {
|
||||
if(*t != *s)
|
||||
return t - t0;
|
||||
t++;
|
||||
s++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
CONSOLE_APP_MAIN
|
||||
{
|
||||
StdLogSetup(LOG_COUT|LOG_FILE);
|
||||
|
||||
byte a[497], b[497];
|
||||
for(int i = 0; i < 497; i++)
|
||||
a[i] = i;
|
||||
|
||||
for(int i = 0; i < 497; i++) {
|
||||
memcpy(a, b, 497);
|
||||
b[i] = 13;
|
||||
|
||||
int len, len2;
|
||||
for(int n = 0; n < 497; n++) {
|
||||
len = memeq8len(a, b, n);
|
||||
len2 = memeq8len_e(a, b, n);
|
||||
ASSERT(len == len2);
|
||||
}
|
||||
|
||||
for(int n = 0; n < 496; n++) {
|
||||
len = memeq8len(a + 1, b + 1, n);
|
||||
len2 = memeq8len_e(a + 1, b + 1, n);
|
||||
ASSERT(len == len2);
|
||||
}
|
||||
}
|
||||
|
||||
DLOG("============ OK");
|
||||
}
|
||||
9
autotest/memeq8len/memeq8len.upp
Normal file
9
autotest/memeq8len/memeq8len.upp
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
uses
|
||||
Core;
|
||||
|
||||
file
|
||||
memeq8len.cpp;
|
||||
|
||||
mainconfig
|
||||
"" = "";
|
||||
|
||||
43
benchmarks/memeq8len/memeq8len.cpp
Normal file
43
benchmarks/memeq8len/memeq8len.cpp
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#include <Core/Core.h>
|
||||
|
||||
using namespace Upp;
|
||||
|
||||
size_t memeq8len_e(const void *p, const void *q, size_t count)
|
||||
{
|
||||
const byte *t = (byte *)p;
|
||||
const byte *t0 = t;
|
||||
const byte *s = (byte *)q;
|
||||
const byte *et = t0 + count;
|
||||
|
||||
while(t < et) {
|
||||
if(*t != *s)
|
||||
return t - t0;
|
||||
t++;
|
||||
s++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int len, len2;
|
||||
|
||||
CONSOLE_APP_MAIN
|
||||
{
|
||||
StdLogSetup(LOG_COUT|LOG_FILE);
|
||||
|
||||
byte a[497], b[497];
|
||||
for(int i = 0; i < 497; i++)
|
||||
a[i] = Random();
|
||||
|
||||
for(int i = 0; i < 10000; i++)
|
||||
for(int i = 0; i < 497; i++) {
|
||||
memcpy(a, b, 497);
|
||||
b[Random(497)] = 13;
|
||||
|
||||
{ RTIMING("memeqlen"); len += memeq8len(a, b, 497); }
|
||||
{ RTIMING("memeqlen_e"); len2 += memeq8len_e(a, b, 497); }
|
||||
|
||||
{ RTIMING("memeqlen1"); len += memeq8len(a + 1, b + 1, 496); }
|
||||
{ RTIMING("memeqlen_e1"); len2 += memeq8len_e(a + 1, b + 1, 496); }
|
||||
}
|
||||
}
|
||||
9
benchmarks/memeq8len/memeq8len.upp
Normal file
9
benchmarks/memeq8len/memeq8len.upp
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
uses
|
||||
Core;
|
||||
|
||||
file
|
||||
memeq8len.cpp;
|
||||
|
||||
mainconfig
|
||||
"" = "";
|
||||
|
||||
|
|
@ -448,6 +448,33 @@ bool memeq32(const void *p, const void *q, size_t count);
|
|||
bool memeq64(const void *p, const void *q, size_t count);
|
||||
bool memeq128(const void *p, const void *q, size_t count);
|
||||
|
||||
inline
|
||||
size_t memeq8len(const void *p, const void *q, size_t count)
|
||||
{
|
||||
const byte *t = (byte *)p;
|
||||
const byte *t0 = t;
|
||||
const byte *s = (byte *)q;
|
||||
|
||||
const byte *et = t0 + (count & ~15);
|
||||
|
||||
while(t < et) {
|
||||
i8x16 cmp = i8x16(t) == i8x16(s);
|
||||
if(!AllTrue(cmp))
|
||||
return t - t0 + FirstFalse(cmp);
|
||||
t += 16;
|
||||
s += 16;
|
||||
}
|
||||
|
||||
et = t0 + count;
|
||||
while(t < et) {
|
||||
if(*s != *t)
|
||||
return t - t0;
|
||||
s++;
|
||||
t++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <class T>
|
||||
|
|
@ -620,6 +647,24 @@ bool memeq128(const void *p, const void *q, size_t count)
|
|||
return memcmp(p, q, 16 * count) == 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t memeq8len(const void *p, const void *q, size_t count)
|
||||
{
|
||||
const byte *t = (byte *)p;
|
||||
const byte *t0 = t;
|
||||
const byte *s = (byte *)q;
|
||||
const byte *et = t0 + count;
|
||||
|
||||
while(t < et) {
|
||||
if(*t != *s)
|
||||
return t - t0;
|
||||
t++;
|
||||
s++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CPU_LE)
|
||||
|
|
|
|||
|
|
@ -105,6 +105,16 @@ onst]_[@(0.0.255) void]_`*[*@3 p], [@(0.0.255) const]_[@(0.0.255) void]_`*[*@3 q
|
|||
about the same speed. Provided mostly for completeness.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:memeq8len`(const void`*`,const void`*`,size`_t`): size`_t
|
||||
[* memeq8len]([@(0.0.255) const] [@(0.0.255) void] [@(0.0.255) `*][*@3 p],
|
||||
[@(0.0.255) const] [@(0.0.255) void] [@(0.0.255) `*][*@3 q], size`_t
|
||||
[*@3 count])&]
|
||||
[s2;%% Returns the [/ position] such that [/ position ]< [*@3 count ][@(0.0.255) `&`&]
|
||||
[*@3 p][@(0.0.255) `[][/ position][@(0.0.255) `] !`=] [*@3 q][@(0.0.255) `[][/ position][@(0.0.255) `]
|
||||
]. If no such position exists, returns [*@3 count]. In other words
|
||||
returns count of bytes at p and q that are equal.&]
|
||||
[s3; &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:memhash`(const void`*`,size`_t`): [_^Upp`:`:hash`_t^ hash`_t]_[* memhash]([@(0.0.255) c
|
||||
onst]_[@(0.0.255) void]_`*[*@3 ptr], [_^size`_t^ size`_t]_[*@3 size])&]
|
||||
[s2;%% Computes a non`-cryptographic hash of memory block. &]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue