Export of internal Abseil changes.

--
4e224c85c3730398919fc5195cb1fc7a752e6e4f by Mark Barolak <mbar@google.com>:

Update some references to "StringPiece" to say "string_view" instead.

PiperOrigin-RevId: 219693697

--
6bdc925a3db5e97f1f8a404bdfda2e47e48f7b9a by Abseil Team <absl-team@google.com>:

Disable weak symbols for the Windows backend of LLVM, since they are currently buggy. See https://bugs.llvm.org/show_bug.cgi?id=37598 for more information.

PiperOrigin-RevId: 219676493

--
5823f495036181191f435efa4c45d60ca3160145 by Derek Mauro <dmauro@google.com>:

Don't use the SSE2 implementation of container_internal::Group
with -funsigned-char under GCC.

This is a workaround for https://github.com/abseil/abseil-cpp/issues/209.

_mm_cmpgt_epi8 is broken under GCC with -funsigned-char.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87853

PiperOrigin-RevId: 219666066
GitOrigin-RevId: 4e224c85c3730398919fc5195cb1fc7a752e6e4f
Change-Id: I2f115d0256576cf476ae73a9464c21d4106a2a56
This commit is contained in:
Abseil Team 2018-11-01 14:00:22 -07:00 committed by Matt Calabrese
parent cc8dcd307b
commit f95179062e
5 changed files with 71 additions and 47 deletions

View file

@ -337,10 +337,10 @@ inline bool IsDeleted(ctrl_t c) { return c == kDeleted; }
inline bool IsEmptyOrDeleted(ctrl_t c) { return c < kSentinel; }
#if SWISSTABLE_HAVE_SSE2
struct Group {
struct GroupSse2Impl {
static constexpr size_t kWidth = 16; // the number of slots per group
explicit Group(const ctrl_t* pos) {
explicit GroupSse2Impl(const ctrl_t* pos) {
ctrl = _mm_loadu_si128(reinterpret_cast<const __m128i*>(pos));
}
@ -390,11 +390,13 @@ struct Group {
__m128i ctrl;
};
#else
struct Group {
#endif // SWISSTABLE_HAVE_SSE2
struct GroupPortableImpl {
static constexpr size_t kWidth = 8;
explicit Group(const ctrl_t* pos) : ctrl(little_endian::Load64(pos)) {}
explicit GroupPortableImpl(const ctrl_t* pos)
: ctrl(little_endian::Load64(pos)) {}
BitMask<uint64_t, kWidth, 3> Match(h2_t hash) const {
// For the technique, see:
@ -441,12 +443,24 @@ struct Group {
uint64_t ctrl;
};
#endif // SWISSTABLE_HAVE_SSE2
#if SWISSTABLE_HAVE_SSE2 && defined(__GNUC__) && !defined(__clang__)
// https://github.com/abseil/abseil-cpp/issues/209
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87853
// _mm_cmpgt_epi8 is broken under GCC with -funsigned-char
// Work around this by using the portable implementation of Group
// when using -funsigned-char under GCC.
using Group = std::conditional<std::is_signed<char>::value, GroupSse2Impl,
GroupPortableImpl>::type;
#elif SWISSTABLE_HAVE_SSE2
using Group = GroupSse2Impl;
#else
using Group = GroupPortableImpl;
#endif
template <class Policy, class Hash, class Eq, class Alloc>
class raw_hash_set;
inline bool IsValidCapacity(size_t n) {
return ((n + 1) & n) == 0 && n >= Group::kWidth - 1;
}