diff options
author | Tor Egge <Tor.Egge@online.no> | 2021-04-30 16:18:39 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2021-04-30 16:18:39 +0200 |
commit | bdd70eb8ee341bf93e4c147f2dd5e1fe30110620 (patch) | |
tree | 343bb8513ab2b8eb0dee218ab98a56e3e9232d04 /vsm | |
parent | 7432ae34d04924cd98e33c608d30b8f1c8b773e2 (diff) |
Avoid SSE2 built-in functions when not using x86_64 arch.
Diffstat (limited to 'vsm')
-rw-r--r-- | vsm/src/tests/textutil/textutil.cpp | 10 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/CMakeLists.txt | 9 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp | 44 |
3 files changed, 59 insertions, 4 deletions
diff --git a/vsm/src/tests/textutil/textutil.cpp b/vsm/src/tests/textutil/textutil.cpp index 42857b8430d..77d13ec3461 100644 --- a/vsm/src/tests/textutil/textutil.cpp +++ b/vsm/src/tests/textutil/textutil.cpp @@ -32,8 +32,10 @@ private: void assertSkipSeparators(const char * input, size_t len, const UCS4V & expdstbuf, const SizeV & expoffsets); void assertAnsiFold(const std::string & toFold, const std::string & exp); void assertAnsiFold(char c, char exp); +#ifdef __x86_64__ void assert_sse2_foldua(const std::string & toFold, size_t charFolded, const std::string & exp); void assert_sse2_foldua(unsigned char c, unsigned char exp, size_t charFolded = 16); +#endif template <typename BW, bool OFF> void testSkipSeparators(); @@ -41,7 +43,9 @@ private: void testSeparatorCharacter(); void testAnsiFold(); void test_lfoldua(); +#ifdef __x86_64__ void test_sse2_foldua(); +#endif public: int Main() override; @@ -91,6 +95,7 @@ TextUtilTest::assertAnsiFold(char c, char exp) EXPECT_EQUAL((int32_t)folded, (int32_t)exp); } +#ifdef __x86_64__ void TextUtilTest::assert_sse2_foldua(const std::string & toFold, size_t charFolded, const std::string & exp) { @@ -116,6 +121,7 @@ TextUtilTest::assert_sse2_foldua(unsigned char c, unsigned char exp, size_t char EXPECT_EQUAL((int32_t)folded[i + alignedStart], (int32_t)exp); } } +#endif template <typename BW, bool OFF> void @@ -227,6 +233,7 @@ TextUtilTest::test_lfoldua() EXPECT_EQUAL(std::string(folded + alignedStart, len), "abcdefghijklmnopqrstuvwxyz"); } +#ifdef __x86_64__ void TextUtilTest::test_sse2_foldua() { @@ -255,6 +262,7 @@ TextUtilTest::test_sse2_foldua() assert_sse2_foldua(i, '?', 0); } } +#endif int TextUtilTest::Main() @@ -265,7 +273,9 @@ TextUtilTest::Main() testSeparatorCharacter(); testAnsiFold(); test_lfoldua(); +#ifdef __x86_64__ test_sse2_foldua(); +#endif TEST_DONE(); } diff --git a/vsm/src/vespa/vsm/searcher/CMakeLists.txt b/vsm/src/vespa/vsm/searcher/CMakeLists.txt index 22c89299721..3589e9e3baf 100644 --- a/vsm/src/vespa/vsm/searcher/CMakeLists.txt +++ b/vsm/src/vespa/vsm/searcher/CMakeLists.txt @@ -1,10 +1,17 @@ # Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(SSE2_FILES "fold.cpp") +else() + unset(SSE2_FILES) +endif() + vespa_add_library(vsm_vsmsearcher OBJECT SOURCES boolfieldsearcher.cpp fieldsearcher.cpp floatfieldsearcher.cpp - fold.cpp + ${SSE2_FILES} futf8strchrfieldsearcher.cpp intfieldsearcher.cpp strchrfieldsearcher.cpp diff --git a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp index e58fab40070..3acf065a8f1 100644 --- a/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp @@ -1,7 +1,9 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "futf8strchrfieldsearcher.h" +#ifdef __x86_64__ #include "fold.h" +#endif #include <vespa/vespalib/util/size_literals.h> using search::byte; @@ -42,8 +44,9 @@ FUTF8StrChrFieldSearcher::ansiFold(const char * toFold, size_t sz, char * folded bool FUTF8StrChrFieldSearcher::lfoldaa(const char * toFold, size_t sz, char * folded, size_t & unalignedStart) { - bool retval(true); unalignedStart = (size_t(toFold) & 0xF); +#ifdef __x86_64__ + bool retval(true); size_t unalignedsz = std::min(sz, (16 - unalignedStart) & 0xF); size_t foldedUnaligned = (size_t(folded) & 0xF); @@ -65,14 +68,17 @@ FUTF8StrChrFieldSearcher::lfoldaa(const char * toFold, size_t sz, char * folded, retval = ansiFold(toFold + unalignedsz + alignsz16, rest, folded+alignedStart+alignsz16); } return retval; +#else + return ansiFold(toFold, sz, folded + unalignedStart); +#endif } bool FUTF8StrChrFieldSearcher::lfoldua(const char * toFold, size_t sz, char * folded, size_t & alignedStart) { - bool retval(true); - alignedStart = 0xF - (size_t(folded + 0xF) % 0x10); +#ifdef __x86_64__ + bool retval(true); size_t alignsz16 = sz & 0xFFFFFFF0; size_t rest = sz - alignsz16; @@ -85,10 +91,14 @@ FUTF8StrChrFieldSearcher::lfoldua(const char * toFold, size_t sz, char * folded, retval = ansiFold(toFold + alignsz16, rest, folded+alignedStart+alignsz16); } return retval; +#else + return ansiFold(toFold, sz, folded + alignedStart); +#endif } namespace { +#ifdef __x86_64__ inline const char * advance(const char * n, const v16qi zero) { uint32_t charMap = 0; @@ -136,12 +146,30 @@ inline const char * advance(const char * n, const v16qi zero) } return n + sum; } +#else +inline const char* advance(const char* n) +{ + const char* p = n; + const char* zero = static_cast<const char *>(memchr(p, 0, 64_Ki)); + while (zero == nullptr) { + p += 64_Ki; + zero = static_cast<const char *>(memchr(p, 0, 64_Ki)); + } + p = zero; + while (*p == '\0') { + ++p; + } + return p; +} +#endif } size_t FUTF8StrChrFieldSearcher::match(const char *folded, size_t sz, QueryTerm & qt) { +#ifdef __x86_64__ const v16qi _G_zero = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +#endif termcount_t words(0); const char * term; termsize_t tsz = qt.term(term); @@ -177,7 +205,11 @@ size_t FUTF8StrChrFieldSearcher::match(const char *folded, size_t sz, QueryTerm } #endif words++; +#ifdef __x86_64__ n = advance(n, _G_zero); +#else + n = advance(n); +#endif } return words; } @@ -185,7 +217,9 @@ size_t FUTF8StrChrFieldSearcher::match(const char *folded, size_t sz, QueryTerm size_t FUTF8StrChrFieldSearcher::match(const char *folded, size_t sz, size_t mintsz, QueryTerm ** qtl, size_t qtlSize) { (void) mintsz; +#ifdef __x86_64__ const v16qi _G_zero = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +#endif termcount_t words(0); const char * n = folded; const char *e = n + sz; @@ -228,7 +262,11 @@ size_t FUTF8StrChrFieldSearcher::match(const char *folded, size_t sz, size_t min } #endif words++; +#ifdef __x86_64__ n = advance(n, _G_zero); +#else + n = advance(n); +#endif } return words; } |