13#ifndef LLVM_SUPPORT_ENDIAN_H
14#define LLVM_SUPPORT_ENDIAN_H
34template<
class T,
int alignment>
36 enum {
value = alignment == 0 ?
alignof(
T) : alignment };
43template <
typename value_type>
51template <
typename value_type, endianness endian>
52[[nodiscard]]
inline value_type
byte_swap(value_type value) {
57template <
typename value_type, std::
size_t alignment = unaligned>
61 memcpy(
static_cast<void *
>(&ret),
68template <
typename value_type, endianness endian, std::
size_t alignment>
69[[nodiscard]]
inline value_type
read(
const void *memory) {
75template <
typename value_type, std::size_t alignment =
unaligned,
77[[nodiscard]]
inline value_type
readNext(
const CharT *&memory,
80 memory +=
sizeof(value_type);
85 std::size_t alignment =
unaligned,
typename CharT>
86[[nodiscard]]
inline value_type
readNext(
const CharT *&memory) {
91template <
typename value_type, std::
size_t alignment = unaligned>
96 &value,
sizeof(value_type));
99template<
typename value_type,
101 std::size_t alignment>
102inline void write(
void *memory, value_type value) {
108template <
typename value_type, std::size_t alignment =
unaligned,
112 memory +=
sizeof(value_type);
116 std::size_t alignment =
unaligned,
typename CharT>
117inline void writeNext(CharT *&memory, value_type value) {
121template <
typename value_type>
126template <
typename value_type, endianness endian, std::
size_t alignment>
138 sizeof(value_type) * 2);
146 (
sizeof(value_type) * 8) - startBit;
153 upperVal <<= numBitsFirstVal;
155 return lowerVal | upperVal;
161template <
typename value_type, endianness endian, std::
size_t alignment>
173 sizeof(value_type) * 2);
181 (
sizeof(value_type) * 8) - startBit;
189 lowerVal <<= startBit;
207 &val[0],
sizeof(value_type) * 2);
228 (
const void*)Value.buffer);
234 (
void*)Value.buffer, newValue);
238 *
this = *
this + newValue;
243 *
this = *
this - newValue;
248 *
this = *
this | newValue;
253 *
this = *
this & newValue;
264 explicit ref(
void *Ptr) : Ptr(Ptr) {}
402template <
typename T, endianness E> [[nodiscard]]
inline T read(
const void *
P) {
445template <
typename T, endianness E>
inline void write(
void *
P,
T V) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ASSUME_ALIGNED(p, a)
\macro LLVM_ASSUME_ALIGNED Returns a pointer with an assumed alignment.
This file implements the C++20 <bit> header.
LLVM Value Representation.
uint64_t read64le(const void *P)
value_type byte_swap(value_type value, endianness endian)
uint16_t read16le(const void *P)
uint32_t read32(const void *P, endianness E)
void writeNext(CharT *&memory, value_type value, endianness endian)
Write a value of a particular endianness, and increment the buffer past that value.
void write16be(void *P, uint16_t V)
void write64le(void *P, uint64_t V)
uint64_t read64be(const void *P)
void write32le(void *P, uint32_t V)
void write32(void *P, uint32_t V, endianness E)
void writeAtBitAlignment(void *memory, value_type value, uint64_t startBit)
Write a value to memory with a particular endianness, for a location that starts at the given bit off...
value_type readAtBitAlignment(const void *memory, uint64_t startBit)
Read a value of a particular endianness from memory, for a location that starts at the given bit offs...
void write32be(void *P, uint32_t V)
uint64_t read64(const void *P, endianness E)
uint32_t read32be(const void *P)
std::make_unsigned_t< value_type > make_unsigned_t
void write16(void *P, uint16_t V, endianness E)
void write16le(void *P, uint16_t V)
void write64be(void *P, uint64_t V)
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
void write64(void *P, uint64_t V, endianness E)
uint16_t read16be(const void *P)
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
uint32_t read32le(const void *P)
uint16_t read16(const void *P, endianness E)
detail::packed_endian_specific_integral< int64_t, llvm::endianness::little, aligned > aligned_little64_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, unaligned > ulittle64_t
detail::packed_endian_specific_integral< int16_t, llvm::endianness::little, unaligned > little16_t
detail::packed_endian_specific_integral< int32_t, llvm::endianness::big, aligned > aligned_big32_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::big, unaligned > ubig64_t
detail::packed_endian_specific_integral< int16_t, llvm::endianness::little, aligned > aligned_little16_t
detail::packed_endian_specific_integral< int32_t, llvm::endianness::big, unaligned > big32_t
detail::packed_endian_specific_integral< int64_t, llvm::endianness::big, aligned > aligned_big64_t
detail::packed_endian_specific_integral< int16_t, llvm::endianness::native, unaligned > unaligned_int16_t
detail::packed_endian_specific_integral< uint8_t, llvm::endianness::little, unaligned > ulittle8_t
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::big, unaligned > ubig16_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::native, unaligned > unaligned_uint64_t
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
detail::packed_endian_specific_integral< int64_t, llvm::endianness::native, unaligned > unaligned_int64_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, aligned > aligned_ulittle64_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::big, aligned > aligned_ubig64_t
detail::packed_endian_specific_integral< T, llvm::endianness::big, aligned > aligned_big_t
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::big, aligned > aligned_ubig16_t
detail::packed_endian_specific_integral< int32_t, llvm::endianness::little, unaligned > little32_t
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, aligned > aligned_ulittle16_t
detail::packed_endian_specific_integral< int16_t, llvm::endianness::big, unaligned > big16_t
detail::packed_endian_specific_integral< int16_t, llvm::endianness::big, aligned > aligned_big16_t
detail::packed_endian_specific_integral< T, llvm::endianness::little, aligned > aligned_little_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::big, unaligned > ubig32_t
detail::packed_endian_specific_integral< int64_t, llvm::endianness::little, unaligned > little64_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::native, unaligned > unaligned_uint32_t
detail::packed_endian_specific_integral< int64_t, llvm::endianness::big, unaligned > big64_t
detail::packed_endian_specific_integral< int32_t, llvm::endianness::native, unaligned > unaligned_int32_t
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::native, unaligned > unaligned_uint16_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::big, aligned > aligned_ubig32_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, aligned > aligned_ulittle32_t
detail::packed_endian_specific_integral< T, llvm::endianness::big, unaligned > big_t
detail::packed_endian_specific_integral< T, llvm::endianness::little, unaligned > little_t
detail::packed_endian_specific_integral< int32_t, llvm::endianness::little, aligned > aligned_little32_t
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
value is either alignment, or alignof(T) if alignment is 0.
void operator=(value_type NewValue)
packed_endian_specific_integral(value_type val)
packed_endian_specific_integral()=default
packed_endian_specific_integral & operator+=(value_type newValue)
packed_endian_specific_integral & operator&=(value_type newValue)
char buffer[sizeof(value_type)]
void operator=(value_type newValue)
static constexpr std::size_t alignment
packed_endian_specific_integral & operator|=(value_type newValue)
packed_endian_specific_integral & operator-=(value_type newValue)