From d50d34e5de7f5cf5e34243210e3df519974d7794 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 27 Oct 2022 15:55:42 -0700 Subject: QLocale: make qstrnto(u)ll not have output arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit That is, return everything in the return argument. On the SysV ABI, that means everything gets returned in registers, in both 32- and 64-bit platforms (unlike QtPrivate::ParsedNumber). There's a minor but perceptible performance improvement in parsing strings and byte arrays. Before: Parsed string "42" "1234" "-1548860221" Clock (ns) 16.673 18.878 25.517 CPU cycles 46.548 52.704 71.243 Instructions 201 233 331 After: Parsed string "42" "1234" "-1548860221" Clock (ns) 15.577 17.998 24.198 CPU cycles 43.491 49.942 67.552 Instructions 179 211 308 On my Core i7-1165G7 @ 2.80 GHz, the 22-23 instruction gain per iteration results in half the expected clock gain in runtime (22 / 2.8 GHz = 7.8 ns) because of a slightly lower instruction per cycle rate. That's acceptable because we need less speculative execution. Pick-to: 6.4 Task-number: QTBUG-107788 Change-Id: I07ec23f3cb174fb197c3fffd17220fd64d473cc0 Reviewed-by: Edward Welbourne --- src/corelib/io/qipaddress.cpp | 12 ++++-------- src/corelib/io/qstorageinfo_unix.cpp | 29 ++++++++++++++++------------- 2 files changed, 20 insertions(+), 21 deletions(-) (limited to 'src/corelib/io') diff --git a/src/corelib/io/qipaddress.cpp b/src/corelib/io/qipaddress.cpp index eeb3d79b06..feed38bef6 100644 --- a/src/corelib/io/qipaddress.cpp +++ b/src/corelib/io/qipaddress.cpp @@ -60,11 +60,9 @@ static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptL ptr[1] != '.' && ptr[1] != '\0') return false; - const char *endptr; - bool ok; - quint64 ll = qstrntoull(ptr, stop - ptr, &endptr, 0, &ok); + auto [ll, endptr] = qstrntoull(ptr, stop - ptr, 0); quint32 x = ll; - if (!ok || endptr == ptr || ll != x) + if (!endptr || endptr == ptr || ll != x) return false; if (*endptr == '.' || dotCount == 3) { @@ -176,15 +174,13 @@ const QChar *parseIp6(IPv6Address &address, const QChar *begin, const QChar *end continue; } - const char *endptr; - bool ok; - quint64 ll = qstrntoull(ptr, stop - ptr, &endptr, 16, &ok); + auto [ll, endptr] = qstrntoull(ptr, stop - ptr, 16); quint16 x = ll; // Reject malformed fields: // - failed to parse // - too many hex digits - if (!ok || endptr > ptr + 4) + if (!endptr || endptr > ptr + 4) return begin + (ptr - buffer.data()); if (*endptr == '.') { diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index 5f3fa32482..be3bf0252d 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -451,32 +451,35 @@ inline bool QStorageIterator::next() const char *const stop = ptr + len - 1; // parse the line - bool ok; mnt.mnt_freq = 0; mnt.mnt_passno = 0; - mnt.mount_id = qstrntoll(ptr, stop - ptr, const_cast(&ptr), 10, &ok); - if (!ok) + auto r = qstrntoll(ptr, stop - ptr, 10); + if (!r.ok()) return false; + mnt.mount_id = r.result; - int parent_id = qstrntoll(ptr, stop - ptr, const_cast(&ptr), 10, &ok); - Q_UNUSED(parent_id); - if (!ok) + r = qstrntoll(r.endptr, stop - r.endptr, 10); + if (!r.ok()) return false; + int parent_id = r.result; + Q_UNUSED(parent_id); - int rdevmajor = qstrntoll(ptr, stop - ptr, const_cast(&ptr), 10, &ok); - if (!ok) + r = qstrntoll(r.endptr, stop - r.endptr, 10); + if (!r.ok()) return false; - if (*ptr != ':') + if (*r.endptr != ':') return false; - int rdevminor = qstrntoll(ptr + 1, stop - ptr - 1, const_cast(&ptr), 10, &ok); - if (!ok) + int rdevmajor = r.result; + r = qstrntoll(r.endptr + 1, stop - r.endptr - 1, 10); + if (!r.ok()) return false; - mnt.rdev = makedev(rdevmajor, rdevminor); + mnt.rdev = makedev(rdevmajor, r.result); - if (*ptr != ' ') + if (*r.endptr != ' ') return false; + ptr = const_cast(r.endptr); mnt.subvolume = ++ptr; ptr = parseMangledPath(ptr); if (!ptr) -- cgit v1.2.3