aboutsummaryrefslogtreecommitdiffstats
path: root/vsm
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2021-04-30 16:18:39 +0200
committerTor Egge <Tor.Egge@online.no>2021-04-30 16:18:39 +0200
commitbdd70eb8ee341bf93e4c147f2dd5e1fe30110620 (patch)
tree343bb8513ab2b8eb0dee218ab98a56e3e9232d04 /vsm
parent7432ae34d04924cd98e33c608d30b8f1c8b773e2 (diff)
Avoid SSE2 built-in functions when not using x86_64 arch.
Diffstat (limited to 'vsm')
-rw-r--r--vsm/src/tests/textutil/textutil.cpp10
-rw-r--r--vsm/src/vespa/vsm/searcher/CMakeLists.txt9
-rw-r--r--vsm/src/vespa/vsm/searcher/futf8strchrfieldsearcher.cpp44
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;
}