1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VPX_PORTS_MEM_OPS_ALIGNED_H_
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VPX_PORTS_MEM_OPS_ALIGNED_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* \file
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan * \brief Provides portable memory access primitives for operating on aligned
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan *        data
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This file is split from mem_ops.h for easier maintenance. See mem_ops.h
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan * for a more detailed description of these primitives.
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef INCLUDED_BY_MEM_OPS_H
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#error Include mem_ops.h, not mem_ops_aligned.h directly.
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Architectures that provide instructions for doing this byte swapping
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan * could redefine these macros.
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define swap_endian_16(val,raw) do {\
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    val = ((raw>>8) & 0x00ff) \
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan          | ((raw<<8) & 0xff00);\
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } while(0)
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define swap_endian_32(val,raw) do {\
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    val = ((raw>>24) & 0x000000ff) \
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan          | ((raw>>8)  & 0x0000ff00) \
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan          | ((raw<<8)  & 0x00ff0000) \
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan          | ((raw<<24) & 0xff000000); \
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } while(0)
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define swap_endian_16_se(val,raw) do {\
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    swap_endian_16(val,raw);\
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    val = ((val << 16) >> 16);\
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } while(0)
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define swap_endian_32_se(val,raw) swap_endian_32(val,raw)
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_ne_aligned_generic(end,sz) \
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *mem;\
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sne_aligned_generic(end,sz) \
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int##sz##_t *mem = (const int##sz##_t *)vmem;\
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *mem;\
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_se_aligned_generic(end,sz) \
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned MEM_VALUE_T val, raw = *mem;\
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    swap_endian_##sz(val,raw);\
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return val;\
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sse_aligned_generic(end,sz) \
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int##sz##_t *mem = (const int##sz##_t *)vmem;\
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned MEM_VALUE_T val, raw = *mem;\
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    swap_endian_##sz##_se(val,raw);\
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return val;\
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_ne_aligned_generic(end,sz) \
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uint##sz##_t *mem = (uint##sz##_t *)vmem;\
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *mem = (uint##sz##_t)val;\
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_se_aligned_generic(end,sz) \
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    uint##sz##_t *mem = (uint##sz##_t *)vmem, raw;\
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    swap_endian_##sz(raw,val);\
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *mem = (uint##sz##_t)raw;\
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_BIG_ENDIAN
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be_aligned_generic(sz)  mem_get_ne_aligned_generic(be,sz)
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe_aligned_generic(sz) mem_get_sne_aligned_generic(be,sz)
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le_aligned_generic(sz)  mem_get_se_aligned_generic(le,sz)
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle_aligned_generic(sz) mem_get_sse_aligned_generic(le,sz)
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be_aligned_generic(sz)  mem_put_ne_aligned_generic(be,sz)
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le_aligned_generic(sz)  mem_put_se_aligned_generic(le,sz)
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be_aligned_generic(sz)  mem_get_se_aligned_generic(be,sz)
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe_aligned_generic(sz) mem_get_sse_aligned_generic(be,sz)
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le_aligned_generic(sz)  mem_get_ne_aligned_generic(le,sz)
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle_aligned_generic(sz) mem_get_sne_aligned_generic(le,sz)
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be_aligned_generic(sz)  mem_put_se_aligned_generic(be,sz)
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le_aligned_generic(sz)  mem_put_ne_aligned_generic(le,sz)
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_be16_aligned
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be16_aligned mem_ops_wrap_symbol(mem_get_be16_aligned)
106233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_be_aligned_generic(16)
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_be32_aligned
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be32_aligned mem_ops_wrap_symbol(mem_get_be32_aligned)
110233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_be_aligned_generic(32)
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_le16_aligned
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le16_aligned mem_ops_wrap_symbol(mem_get_le16_aligned)
114233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_le_aligned_generic(16)
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_le32_aligned
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le32_aligned mem_ops_wrap_symbol(mem_get_le32_aligned)
118233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_le_aligned_generic(32)
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_sbe16_aligned
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe16_aligned mem_ops_wrap_symbol(mem_get_sbe16_aligned)
122233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_sbe_aligned_generic(16)
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_sbe32_aligned
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe32_aligned mem_ops_wrap_symbol(mem_get_sbe32_aligned)
126233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_sbe_aligned_generic(32)
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_sle16_aligned
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle16_aligned mem_ops_wrap_symbol(mem_get_sle16_aligned)
130233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_sle_aligned_generic(16)
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_get_sle32_aligned
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle32_aligned mem_ops_wrap_symbol(mem_get_sle32_aligned)
134233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_sle_aligned_generic(32)
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_put_be16_aligned
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be16_aligned mem_ops_wrap_symbol(mem_put_be16_aligned)
138233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_put_be_aligned_generic(16)
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_put_be32_aligned
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be32_aligned mem_ops_wrap_symbol(mem_put_be32_aligned)
142233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_put_be_aligned_generic(32)
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_put_le16_aligned
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le16_aligned mem_ops_wrap_symbol(mem_put_le16_aligned)
146233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_put_le_aligned_generic(16)
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef  mem_put_le32_aligned
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le32_aligned mem_ops_wrap_symbol(mem_put_le32_aligned)
150233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_put_le_aligned_generic(32)
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_ne_aligned_generic
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_se_aligned_generic
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sne_aligned_generic
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sse_aligned_generic
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_ne_aligned_generic
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_se_aligned_generic
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef swap_endian_16
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef swap_endian_32
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef swap_endian_16_se
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef swap_endian_32_se
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VPX_PORTS_MEM_OPS_ALIGNED_H_
164