summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kaster <akaster@serenityos.org>2021-07-10 14:22:37 -0600
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-07-12 18:42:45 +0430
commitfac4eab415c9066679f85699aa0a4c2bd4240bcd (patch)
tree13d98acdff96a4179068e1e7500b8d5e97df03d9
parent19d34414bccc62202064077f8150cc8b57fc64b6 (diff)
downloadserenity-fac4eab415c9066679f85699aa0a4c2bd4240bcd.zip
AK: Add load64 and load_pointer to AK::ByteReader
This lets us load misaligned 64 bit integers, and misaligned pointers in a platform agnostic way.
-rw-r--r--AK/ByteReader.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/AK/ByteReader.h b/AK/ByteReader.h
index 5c2a4a8bba..c0da52fe9b 100644
--- a/AK/ByteReader.h
+++ b/AK/ByteReader.h
@@ -49,6 +49,27 @@ struct ByteReader {
value = v._32;
}
+ static void load(const u8* address, u64& value)
+ {
+ union {
+ u64 _64;
+ u8 _8[8];
+ } v { ._64 = 0 };
+ __builtin_memcpy(&v._8, address, 8);
+ value = v._64;
+ }
+
+ template<typename T>
+ static T* load_pointer(const u8* address)
+ {
+ if constexpr (sizeof(T*) == 4) {
+ return reinterpret_cast<T*>(load32(address));
+ } else {
+ static_assert(sizeof(T*) == 8, "sizeof(T*) must be either 4 or 8");
+ return reinterpret_cast<T*>(load64(address));
+ }
+ }
+
static u16 load16(const u8* address)
{
u16 value;
@@ -62,6 +83,13 @@ struct ByteReader {
load(address, value);
return value;
}
+
+ static u64 load64(const u8* address)
+ {
+ u64 value;
+ load(address, value);
+ return value;
+ }
};
}