forked from weaselab/conflict-set
Add multi-version rezero16
This commit is contained in:
+29
-10
@@ -1332,6 +1332,29 @@ void maybeDecreaseCapacity(Node *&self, WriteContext *tls,
|
|||||||
freeAndMakeCapacityAtLeast(self, maxCapacity, tls, impl, false);
|
freeAndMakeCapacityAtLeast(self, maxCapacity, tls, impl, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAS_AVX) && !defined(__SANITIZE_THREAD__)
|
||||||
|
// This gets covered in local development
|
||||||
|
// GCOVR_EXCL_START
|
||||||
|
__attribute__((target("avx512f"))) void rezero16(InternalVersionT *vs,
|
||||||
|
InternalVersionT zero) {
|
||||||
|
uint32_t z;
|
||||||
|
memcpy(&z, &zero, sizeof(z));
|
||||||
|
const auto zvec = _mm512_set1_epi32(z);
|
||||||
|
auto m = _mm512_cmplt_epi32_mask(
|
||||||
|
_mm512_sub_epi32(_mm512_loadu_epi32(vs), zvec), _mm512_setzero_epi32());
|
||||||
|
_mm512_mask_storeu_epi32(vs, m, zvec);
|
||||||
|
}
|
||||||
|
// GCOVR_EXCL_STOP
|
||||||
|
|
||||||
|
__attribute__((target("default")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void rezero16(InternalVersionT *vs, InternalVersionT zero) {
|
||||||
|
for (int i = 0; i < 16; ++i) {
|
||||||
|
vs[i] = std::max(vs[i], zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void rezero(Node *n, InternalVersionT z) {
|
void rezero(Node *n, InternalVersionT z) {
|
||||||
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
fprintf(stderr, "rezero to %" PRId64 ": %s\n", z.toInt64(),
|
fprintf(stderr, "rezero to %" PRId64 ": %s\n", z.toInt64(),
|
||||||
@@ -1352,14 +1375,12 @@ void rezero(Node *n, InternalVersionT z) {
|
|||||||
} break;
|
} break;
|
||||||
case Type_Node16: {
|
case Type_Node16: {
|
||||||
auto *self = static_cast<Node16 *>(n);
|
auto *self = static_cast<Node16 *>(n);
|
||||||
for (int i = 0; i < 16; ++i) {
|
rezero16(self->childMaxVersion, z);
|
||||||
self->childMaxVersion[i] = std::max(self->childMaxVersion[i], z);
|
|
||||||
}
|
|
||||||
} break;
|
} break;
|
||||||
case Type_Node48: {
|
case Type_Node48: {
|
||||||
auto *self = static_cast<Node48 *>(n);
|
auto *self = static_cast<Node48 *>(n);
|
||||||
for (int i = 0; i < 48; ++i) {
|
for (int i = 0; i < 48; i += 16) {
|
||||||
self->childMaxVersion[i] = std::max(self->childMaxVersion[i], z);
|
rezero16(self->childMaxVersion + i, z);
|
||||||
}
|
}
|
||||||
for (auto &m : self->maxOfMax) {
|
for (auto &m : self->maxOfMax) {
|
||||||
m = std::max(m, z);
|
m = std::max(m, z);
|
||||||
@@ -1367,12 +1388,10 @@ void rezero(Node *n, InternalVersionT z) {
|
|||||||
} break;
|
} break;
|
||||||
case Type_Node256: {
|
case Type_Node256: {
|
||||||
auto *self = static_cast<Node256 *>(n);
|
auto *self = static_cast<Node256 *>(n);
|
||||||
for (int i = 0; i < 256; ++i) {
|
for (int i = 0; i < 256; i += 16) {
|
||||||
self->childMaxVersion[i] = std::max(self->childMaxVersion[i], z);
|
rezero16(self->childMaxVersion + i, z);
|
||||||
}
|
|
||||||
for (auto &m : self->maxOfMax) {
|
|
||||||
m = std::max(m, z);
|
|
||||||
}
|
}
|
||||||
|
rezero16(self->maxOfMax, z);
|
||||||
} break;
|
} break;
|
||||||
default: // GCOVR_EXCL_LINE
|
default: // GCOVR_EXCL_LINE
|
||||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||||
|
|||||||
Reference in New Issue
Block a user