Skip to content

Commit

Permalink
AK: Add load64 and load_pointer to AK::ByteReader
Browse files Browse the repository at this point in the history
This lets us load misaligned 64 bit integers, and misaligned pointers
in a platform agnostic way.
  • Loading branch information
ADKaster authored and alimpfard committed Jul 12, 2021
1 parent 19d3441 commit fac4eab
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions AK/ByteReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -62,6 +83,13 @@ struct ByteReader {
load(address, value);
return value;
}

static u64 load64(const u8* address)
{
u64 value;
load(address, value);
return value;
}
};

}
Expand Down

0 comments on commit fac4eab

Please sign in to comment.