15e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===- Endian.h - Utilities for IO with endian specific data ----*- C++ -*-===//
25e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//
35e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//                     The LLVM Compiler Infrastructure
45e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//
55e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// This file is distributed under the University of Illinois Open Source
65e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// License. See LICENSE.TXT for details.
75e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//
85e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===----------------------------------------------------------------------===//
95e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//
105e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer// This file declares generic functions to read and write endian specific data.
115e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//
125e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer//===----------------------------------------------------------------------===//
135e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
145e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#ifndef LLVM_SUPPORT_ENDIAN_H
155e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#define LLVM_SUPPORT_ENDIAN_H
165e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
17c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer#include "llvm/Support/AlignOf.h"
181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Host.h"
191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/SwapByteOrder.h"
205e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
215e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace llvm {
225e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace support {
23c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerenum endianness {big, little, native};
245e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
25c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer// These are named values for common alignments.
26c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerenum {aligned = 0, unaligned = 1};
275e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
285e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace detail {
29c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  /// \brief ::value is either alignment, or alignof(T) if alignment is 0.
30c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  template<class T, int alignment>
31c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  struct PickAlignment {
32c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer    enum {value = alignment == 0 ? AlignOf<T>::Alignment : alignment};
33c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  };
345e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace detail
355e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
362e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencernamespace endian {
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Swap the bytes of value to match the given endianness.
38c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type, endianness endian>
39c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline value_type byte_swap(value_type value) {
4021a01d1ea89dba97c4f9e1f9f41485729a4046bcRafael Espindola  if (endian != native && sys::IsBigEndianHost != (endian == big))
41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    sys::swapByteOrder(value);
42c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  return value;
43c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer}
442e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Read a value of a particular endianness from memory.
46c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type,
47c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         endianness endian,
48c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         std::size_t alignment>
49c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline value_type read(const void *memory) {
50c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  value_type ret;
51c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer
52c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  memcpy(&ret,
53c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         LLVM_ASSUME_ALIGNED(memory,
54c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer           (detail::PickAlignment<value_type, alignment>::value)),
55c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         sizeof(value_type));
56c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  return byte_swap<value_type, endian>(ret);
57c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer}
582e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Read a value of a particular endianness from a buffer, and increment the
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// buffer past that value.
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainartemplate<typename value_type, endianness endian, std::size_t alignment,
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar         typename CharT>
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline value_type readNext(const CharT *&memory) {
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  value_type ret = read<value_type, endian, alignment>(memory);
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  memory += sizeof(value_type);
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return ret;
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Write a value to memory with a particular endianness.
70c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertemplate<typename value_type,
71c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         endianness endian,
72c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         std::size_t alignment>
73c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerinline void write(void *memory, value_type value) {
74c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  value = byte_swap<value_type, endian>(value);
75c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  memcpy(LLVM_ASSUME_ALIGNED(memory,
76c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer           (detail::PickAlignment<value_type, alignment>::value)),
77c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         &value,
78c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         sizeof(value_type));
792e6048f8690105f7174e24ceba8e7c9f67009411Michael J. Spencer}
80c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer} // end namespace endian
815e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
825e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencernamespace detail {
835e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertemplate<typename value_type,
84fd7c230c85dbc9b1c5145319a0d5eaeb99f61176Michael J. Spencer         endianness endian,
85c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer         std::size_t alignment>
86c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencerstruct packed_endian_specific_integral {
875e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer  operator value_type() const {
88c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer    return endian::read<value_type, endian, alignment>(
89c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer      (const void*)Value.buffer);
905e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer  }
915e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
9224973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky  void operator=(value_type newValue) {
93c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer    endian::write<value_type, endian, alignment>(
94c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer      (void*)Value.buffer, newValue);
9524973c1063bfb7ac353732a4e8eb801830336c5fEli Bendersky  }
965e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  packed_endian_specific_integral &operator+=(value_type newValue) {
9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    *this = *this + newValue;
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return *this;
10037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  packed_endian_specific_integral &operator-=(value_type newValue) {
10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    *this = *this - newValue;
10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return *this;
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1075e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencerprivate:
108c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer  AlignedCharArray<PickAlignment<value_type, alignment>::value,
109c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                   sizeof(value_type)> Value;
11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct ref {
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    explicit ref(void *Ptr) : Ptr(Ptr) {}
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    operator value_type() const {
11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return endian::read<value_type, endian, alignment>(Ptr);
11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    void operator=(value_type NewValue) {
12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      endian::write<value_type, endian, alignment>(Ptr, NewValue);
12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  private:
12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    void *Ptr;
12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
1265e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer};
12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1285e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace detail
1295e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1305e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1315e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint16_t, little, unaligned> ulittle16_t;
1325e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1335e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint32_t, little, unaligned> ulittle32_t;
1345e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1355e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint64_t, little, unaligned> ulittle64_t;
1365e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1375e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1385e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int16_t, little, unaligned> little16_t;
1395e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1405e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int32_t, little, unaligned> little32_t;
1415e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1425e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int64_t, little, unaligned> little64_t;
1435e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1445e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1455e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint16_t, little, aligned> aligned_ulittle16_t;
1465e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1475e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint32_t, little, aligned> aligned_ulittle32_t;
1485e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1495e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint64_t, little, aligned> aligned_ulittle64_t;
1505e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1515e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1525e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int16_t, little, aligned> aligned_little16_t;
1535e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1545e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int32_t, little, aligned> aligned_little32_t;
1555e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1565e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int64_t, little, aligned> aligned_little64_t;
1575e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1585e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1595e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint16_t, big, unaligned>    ubig16_t;
1605e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1615e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint32_t, big, unaligned>    ubig32_t;
1625e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1635e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                  <uint64_t, big, unaligned>    ubig64_t;
1645e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1655e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1665e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int16_t, big, unaligned>    big16_t;
1675e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1685e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int32_t, big, unaligned>    big32_t;
1695e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1705e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                   <int64_t, big, unaligned>    big64_t;
1715e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1725e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1735e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint16_t, big, aligned>    aligned_ubig16_t;
1745e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1755e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint32_t, big, aligned>    aligned_ubig32_t;
1765e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1775e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                    <uint64_t, big, aligned>    aligned_ubig64_t;
1785e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
1795e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1805e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int16_t, big, aligned>    aligned_big16_t;
1815e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1825e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int32_t, big, aligned>    aligned_big32_t;
1835e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencertypedef detail::packed_endian_specific_integral
1845e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer                     <int64_t, big, aligned>    aligned_big64_t;
1855e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
186c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
187c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                  <uint16_t, native, unaligned> unaligned_uint16_t;
188c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
189c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                  <uint32_t, native, unaligned> unaligned_uint32_t;
190c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
191c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                  <uint64_t, native, unaligned> unaligned_uint64_t;
192c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer
193c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
194c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                   <int16_t, native, unaligned> unaligned_int16_t;
195c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
196c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                   <int32_t, native, unaligned> unaligned_int32_t;
197c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencertypedef detail::packed_endian_specific_integral
198c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer                   <int64_t, native, unaligned> unaligned_int64_t;
1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace endian {
2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint16_t read16le(const void *p) { return *(const ulittle16_t *)p; }
2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint32_t read32le(const void *p) { return *(const ulittle32_t *)p; }
2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint64_t read64le(const void *p) { return *(const ulittle64_t *)p; }
2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint16_t read16be(const void *p) { return *(const ubig16_t *)p; }
2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint32_t read32be(const void *p) { return *(const ubig32_t *)p; }
2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline uint64_t read64be(const void *p) { return *(const ubig64_t *)p; }
2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write16le(void *p, uint16_t v) { *(ulittle16_t *)p = v; }
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write32le(void *p, uint32_t v) { *(ulittle32_t *)p = v; }
2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write64le(void *p, uint64_t v) { *(ulittle64_t *)p = v; }
2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write16be(void *p, uint16_t v) { *(ubig16_t *)p = v; }
2124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write32be(void *p, uint32_t v) { *(ubig32_t *)p = v; }
2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarinline void write64be(void *p, uint64_t v) { *(ubig64_t *)p = v; }
2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace endian
2155e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer} // end namespace support
2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // end namespace llvm
2175e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer
2185e0b2bf657dd8b6b3bb58439e6cb293f3116687fMichael J. Spencer#endif
219