diff --git a/uppsrc/Core/Defs.h b/uppsrc/Core/Defs.h index e3ca56bb9..13f31cda4 100644 --- a/uppsrc/Core/Defs.h +++ b/uppsrc/Core/Defs.h @@ -404,6 +404,12 @@ typedef long long unsigned uint64; typedef uint64 qword; +struct m128 { + int64 i64[2]; + + static m128 Zero() { m128 a; a.i64[0] = a.i64[1] = 0; return a; } +}; + inline bool IsNaN(double d) { return std::isnan(d); } inline bool IsInf(double d) { return std::isinf(d); } inline bool IsFin(double d) { return !IsNaN(d) && !IsInf(d); } diff --git a/uppsrc/Core/Mem.cpp b/uppsrc/Core/Mem.cpp index 1247e7ea8..10afa1512 100644 --- a/uppsrc/Core/Mem.cpp +++ b/uppsrc/Core/Mem.cpp @@ -86,6 +86,7 @@ bool memeq8(const void *p, const void *q, size_t len) { return inline_memeq8_ali bool memeq16(const void *p, const void *q, size_t len) { return inline_memeq16_aligned(p, q, len); } bool memeq32(const void *p, const void *q, size_t len) { return inline_memeq32_aligned(p, q, len); } bool memeq64(const void *p, const void *q, size_t len) { return inline_memeq64_aligned(p, q, len); } +bool memeq128(const void *p, const void *q, size_t len) { return inline_memeq128_aligned(p, q, len); } #endif diff --git a/uppsrc/Core/Mem.h b/uppsrc/Core/Mem.h index 0c39ab19c..c06353198 100644 --- a/uppsrc/Core/Mem.h +++ b/uppsrc/Core/Mem.h @@ -105,6 +105,13 @@ void memset64(void *p, qword data, size_t len) Set128(0); } +inline +void memset128(void *t, m128 data, size_t len) +{ + if(len) + memset8__(t, *(__m128i *)&data, 16 * len); +} + void memcpy8__(void *p, const void *q, size_t len); inline @@ -390,10 +397,17 @@ bool inline_memeq64_aligned(const void *p, const void *q, size_t len) return memeq8__(t, s, 8 * len); } +force_inline +bool inline_memeq128_aligned(const void *t, const void *s, size_t len) +{ + return len == 0 || memeq8__(t, s, 16 * len); +} + bool memeq8(const void *p, const void *q, size_t len); bool memeq16(const void *p, const void *q, size_t len); bool memeq32(const void *p, const void *q, size_t len); bool memeq64(const void *p, const void *q, size_t len); +bool memeq128(const void *p, const void *q, size_t len); #else