Merge upstream/inline-varint-fast-path into integration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
J. Nick Koston
2026-03-07 15:42:58 -10:00
co-authored by Claude Opus 4.6
2 changed files with 19 additions and 25 deletions
+1 -12
View File
@@ -16,18 +16,7 @@ void ProtoByteBuffer::grow_(size_t n) {
this->capacity_ = n;
}
uint32_t ProtoSize::varint_slow_(uint32_t value) {
// value is guaranteed >= 128 here (fast path handled inline)
if (value < 16384) {
return 2; // 14 bits
} else if (value < 2097152) {
return 3; // 21 bits
} else if (value < 268435456) {
return 4; // 28 bits
} else {
return 5; // 32 bits (maximum for uint32_t)
}
}
uint32_t ProtoSize::varint_slow(uint32_t value) { return varint_wide(value); }
#ifdef USE_API_VARINT64
optional<ProtoVarInt> ProtoVarInt::parse_wide(const uint8_t *buffer, uint32_t len, uint32_t *consumed,
+18 -13
View File
@@ -556,21 +556,26 @@ class ProtoSize {
static constexpr inline uint32_t ESPHOME_ALWAYS_INLINE varint(uint32_t value) {
if (value < 128)
return 1; // Fast path: 7 bits, most common case
if (__builtin_is_constant_evaluated()) {
// Compile-time: full cascade for constexpr callers
if (value < 16384)
return 2;
if (value < 2097152)
return 3;
if (value < 268435456)
return 4;
return 5;
}
return varint_slow_(value);
if (__builtin_is_constant_evaluated())
return varint_wide(value);
return varint_slow(value);
}
// Slow path for varint >= 128, outlined to keep fast path small
static uint32_t varint_slow_(uint32_t value) __attribute__((noinline));
private:
// Slow path for varint >= 128, outlined to keep fast path small
static uint32_t varint_slow(uint32_t value) __attribute__((noinline));
// Shared cascade for values >= 128 (used by both constexpr and noinline paths)
static constexpr inline uint32_t ESPHOME_ALWAYS_INLINE varint_wide(uint32_t value) {
if (value < 16384)
return 2;
if (value < 2097152)
return 3;
if (value < 268435456)
return 4;
return 5;
}
public:
/**
* @brief Calculates the size in bytes needed to encode a uint64_t value as a varint
*