[Kernel] add optimized uint32/uint64 appending methods to stringbuffer.

use fast uint append methods in kernel call formatting, massive speedup in q4 mp
This commit is contained in:
disjtqz
2025-10-20 17:15:03 +09:00
committed by Herman S.
parent 1cc0d98246
commit 0d7cca7d2f
3 changed files with 85 additions and 14 deletions
+68
View File
@@ -101,5 +101,73 @@ std::vector<uint8_t> StringBuffer::to_bytes() const {
std::memcpy(bytes.data(), buffer_, buffer_offset_);
return bytes;
}
#if XE_ARCH_AMD64 == 1
static __m128i ToHexUpper(__m128i value) {
__m128i w = _mm_cvtepu8_epi16(value);
__m128i msk =
_mm_and_si128(_mm_or_si128(_mm_srli_epi16(w, 4), _mm_bslli_si128(w, 1)),
_mm_set1_epi16(0x0F0F));
__m128i conv =
_mm_shuffle_epi8(_mm_setr_epi8('0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'),
msk);
return conv;
}
#endif
void StringBuffer::AppendHexUInt64(uint64_t value) {
#if XE_ARCH_AMD64 == 1
__m128i conv = ToHexUpper(_mm_cvtsi64_si128(static_cast<long long>(value)));
AppendBytes(reinterpret_cast<const uint8_t*>(&conv), 16);
#else
AppendFormat("{:016X}", value);
#endif
}
void StringBuffer::AppendHexUInt32(uint32_t value) {
#if XE_ARCH_AMD64 == 1
__m128i conv = ToHexUpper(_mm_cvtsi32_si128(static_cast<int>(value)));
uint64_t low = _mm_cvtsi128_si64(conv);
AppendBytes(reinterpret_cast<const uint8_t*>(&low), 8);
#else
AppendFormat("{:08X}", value);
#endif
}
void StringBuffer::AppendParenthesizedHexUInt32(uint32_t value) {
#if XE_ARCH_AMD64 == 1
Grow(10);
buffer_[buffer_offset_] = '(';
*reinterpret_cast<long long*>(&buffer_[buffer_offset_ + 1]) =
_mm_cvtsi128_si64(ToHexUpper(_mm_cvtsi32_si128(value)));
buffer_[buffer_offset_ + 9] = ')';
buffer_offset_ += 10;
buffer_[buffer_offset_] = 0;
#else
AppendFormat("({:08X})", value);
#endif
}
void StringBuffer::AppendParenthesizedHexUInt64(uint64_t value) {
#if XE_ARCH_AMD64 == 1
Grow(18);
buffer_[buffer_offset_] = '(';
__m128i conv = ToHexUpper(_mm_cvtsi64_si128(static_cast<long long>(value)));
_mm_storeu_si128(reinterpret_cast<__m128i*>(&buffer_[buffer_offset_ + 1]),
conv);
buffer_[buffer_offset_ + 17] = ')';
buffer_offset_ += 18;
buffer_[buffer_offset_] = 0;
#else
AppendFormat("({:016X})", value);
#endif
}
} // namespace xe
+4 -1
View File
@@ -38,7 +38,10 @@ class StringBuffer {
auto s = fmt::format(fmt::runtime(format), args...);
Append(s.c_str());
}
void AppendHexUInt64(uint64_t value);
void AppendHexUInt32(uint32_t value);
void AppendParenthesizedHexUInt32(uint32_t value);
void AppendParenthesizedHexUInt64(uint64_t value);
void AppendVarargs(const char* format, va_list args);
void AppendBytes(const uint8_t* buffer, size_t length);
+13 -13
View File
@@ -409,10 +409,10 @@ inline void AppendParam(StringBuffer* string_buffer, word_t param) {
string_buffer->AppendFormat("{:04X}", uint16_t(param));
}
inline void AppendParam(StringBuffer* string_buffer, dword_t param) {
string_buffer->AppendFormat("{:08X}", uint32_t(param));
string_buffer->AppendHexUInt32(uint32_t(param));
}
inline void AppendParam(StringBuffer* string_buffer, qword_t param) {
string_buffer->AppendFormat("{:016X}", uint64_t(param));
string_buffer->AppendHexUInt64(uint64_t(param));
}
inline void AppendParam(StringBuffer* string_buffer, float_t param) {
string_buffer->AppendFormat("{:G}", static_cast<float>(param));
@@ -421,28 +421,28 @@ inline void AppendParam(StringBuffer* string_buffer, double_t param) {
string_buffer->AppendFormat("{:G}", static_cast<double>(param));
}
inline void AppendParam(StringBuffer* string_buffer, lpvoid_t param) {
string_buffer->AppendFormat("{:08X}", uint32_t(param));
string_buffer->AppendHexUInt32(uint32_t(param));
}
inline void AppendParam(StringBuffer* string_buffer, lpdword_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({:08X})", param.value());
string_buffer->AppendParenthesizedHexUInt32(param.value());
}
}
inline void AppendParam(StringBuffer* string_buffer, lpqword_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({:016X})", param.value());
string_buffer->AppendParenthesizedHexUInt64(param.value());
}
}
inline void AppendParam(StringBuffer* string_buffer, lpfloat_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({:G})", param.value());
}
}
inline void AppendParam(StringBuffer* string_buffer, lpdouble_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({:G})", param.value());
}
@@ -451,20 +451,20 @@ inline void AppendParam(StringBuffer* string_buffer, ppc_context_t param) {
string_buffer->Append("ContextArg");
}
inline void AppendParam(StringBuffer* string_buffer, lpstring_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({})", param.value());
}
}
inline void AppendParam(StringBuffer* string_buffer, lpu16string_t param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
if (param) {
string_buffer->AppendFormat("({})", xe::to_utf8(param.value()));
}
}
inline void AppendParam(StringBuffer* string_buffer,
pointer_t<X_OBJECT_ATTRIBUTES> record) {
string_buffer->AppendFormat("{:08X}", record.guest_address());
string_buffer->AppendHexUInt32(record.guest_address());
if (record) {
auto name_string =
kernel_memory()->TranslateVirtual<X_ANSI_STRING*>(record->name_ptr);
@@ -490,7 +490,7 @@ inline void AppendParam(StringBuffer* string_buffer,
}
template <typename T>
void AppendParam(StringBuffer* string_buffer, pointer_t<T> param) {
string_buffer->AppendFormat("{:08X}", param.guest_address());
string_buffer->AppendHexUInt32(param.guest_address());
}
enum class KernelModuleId {