From 821d9a377ce16f651d643b2ba60cf17f4e291e23 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 16 Jun 2020 14:49:58 +0000 Subject: [PATCH] Core: memset128, memeq128 git-svn-id: svn://ultimatepp.org/upp/trunk@14600 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Defs.h | 6 ++++++ uppsrc/Core/Mem.cpp | 1 + uppsrc/Core/Mem.h | 14 ++++++++++++++ 3 files changed, 21 insertions(+) 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