190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifndef VPX_PORTS_MEM_OPS_ALIGNED_H_ 122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define VPX_PORTS_MEM_OPS_ALIGNED_H_ 132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_integer.h" 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1679f15823c34ae1e423108295e416213200bb280fAndreas Huber/* \file 1779f15823c34ae1e423108295e416213200bb280fAndreas Huber * \brief Provides portable memory access primitives for operating on aligned 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * data 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber * This file is split from mem_ops.h for easier maintenance. See mem_ops.h 2179f15823c34ae1e423108295e416213200bb280fAndreas Huber * for a more detailed description of these primitives. 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef INCLUDED_BY_MEM_OPS_H 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#error Include mem_ops.h, not mem_ops_aligned.h directly. 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Architectures that provide instructions for doing this byte swapping 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * could redefine these macros. 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define swap_endian_16(val,raw) do {\ 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang val = ((raw>>8) & 0x00ff) \ 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang | ((raw<<8) & 0xff00);\ 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while(0) 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define swap_endian_32(val,raw) do {\ 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang val = ((raw>>24) & 0x000000ff) \ 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang | ((raw>>8) & 0x0000ff00) \ 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang | ((raw<<8) & 0x00ff0000) \ 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang | ((raw<<24) & 0xff000000); \ 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while(0) 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define swap_endian_16_se(val,raw) do {\ 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang swap_endian_16(val,raw);\ 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang val = ((val << 16) >> 16);\ 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while(0) 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define swap_endian_32_se(val,raw) swap_endian_32(val,raw) 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_ne_aligned_generic(end,sz) \ 47ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE unsigned MEM_VALUE_T \ 48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_get_##end##sz##_aligned(const void *vmem) {\ 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return *mem;\ 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sne_aligned_generic(end,sz) \ 54ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE signed MEM_VALUE_T \ 55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_get_s##end##sz##_aligned(const void *vmem) {\ 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int##sz##_t *mem = (const int##sz##_t *)vmem;\ 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return *mem;\ 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_se_aligned_generic(end,sz) \ 61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE unsigned MEM_VALUE_T \ 62ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_get_##end##sz##_aligned(const void *vmem) {\ 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned MEM_VALUE_T val, raw = *mem;\ 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang swap_endian_##sz(val,raw);\ 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return val;\ 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sse_aligned_generic(end,sz) \ 70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE signed MEM_VALUE_T \ 71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_get_s##end##sz##_aligned(const void *vmem) {\ 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int##sz##_t *mem = (const int##sz##_t *)vmem;\ 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned MEM_VALUE_T val, raw = *mem;\ 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang swap_endian_##sz##_se(val,raw);\ 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return val;\ 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_ne_aligned_generic(end,sz) \ 79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE void \ 80ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint##sz##_t *mem = (uint##sz##_t *)vmem;\ 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *mem = (uint##sz##_t)val;\ 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_se_aligned_generic(end,sz) \ 86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian static VPX_INLINE void \ 87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint##sz##_t *mem = (uint##sz##_t *)vmem, raw;\ 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang swap_endian_##sz(raw,val);\ 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *mem = (uint##sz##_t)raw;\ 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 931b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_BIG_ENDIAN 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_be_aligned_generic(sz) mem_get_ne_aligned_generic(be,sz) 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sbe_aligned_generic(sz) mem_get_sne_aligned_generic(be,sz) 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_le_aligned_generic(sz) mem_get_se_aligned_generic(le,sz) 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sle_aligned_generic(sz) mem_get_sse_aligned_generic(le,sz) 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_be_aligned_generic(sz) mem_put_ne_aligned_generic(be,sz) 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_le_aligned_generic(sz) mem_put_se_aligned_generic(le,sz) 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_be_aligned_generic(sz) mem_get_se_aligned_generic(be,sz) 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sbe_aligned_generic(sz) mem_get_sse_aligned_generic(be,sz) 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_le_aligned_generic(sz) mem_get_ne_aligned_generic(le,sz) 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sle_aligned_generic(sz) mem_get_sne_aligned_generic(le,sz) 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_be_aligned_generic(sz) mem_put_se_aligned_generic(be,sz) 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_le_aligned_generic(sz) mem_put_ne_aligned_generic(le,sz) 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_be16_aligned 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_be16_aligned mem_ops_wrap_symbol(mem_get_be16_aligned) 1121b362b15af34006e6a11974088a46d42b903418eJohannmem_get_be_aligned_generic(16) 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_be32_aligned 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_be32_aligned mem_ops_wrap_symbol(mem_get_be32_aligned) 1161b362b15af34006e6a11974088a46d42b903418eJohannmem_get_be_aligned_generic(32) 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_le16_aligned 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_le16_aligned mem_ops_wrap_symbol(mem_get_le16_aligned) 1201b362b15af34006e6a11974088a46d42b903418eJohannmem_get_le_aligned_generic(16) 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_le32_aligned 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_le32_aligned mem_ops_wrap_symbol(mem_get_le32_aligned) 1241b362b15af34006e6a11974088a46d42b903418eJohannmem_get_le_aligned_generic(32) 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sbe16_aligned 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sbe16_aligned mem_ops_wrap_symbol(mem_get_sbe16_aligned) 1281b362b15af34006e6a11974088a46d42b903418eJohannmem_get_sbe_aligned_generic(16) 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sbe32_aligned 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sbe32_aligned mem_ops_wrap_symbol(mem_get_sbe32_aligned) 1321b362b15af34006e6a11974088a46d42b903418eJohannmem_get_sbe_aligned_generic(32) 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sle16_aligned 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sle16_aligned mem_ops_wrap_symbol(mem_get_sle16_aligned) 1361b362b15af34006e6a11974088a46d42b903418eJohannmem_get_sle_aligned_generic(16) 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sle32_aligned 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_get_sle32_aligned mem_ops_wrap_symbol(mem_get_sle32_aligned) 1401b362b15af34006e6a11974088a46d42b903418eJohannmem_get_sle_aligned_generic(32) 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_be16_aligned 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_be16_aligned mem_ops_wrap_symbol(mem_put_be16_aligned) 1441b362b15af34006e6a11974088a46d42b903418eJohannmem_put_be_aligned_generic(16) 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_be32_aligned 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_be32_aligned mem_ops_wrap_symbol(mem_put_be32_aligned) 1481b362b15af34006e6a11974088a46d42b903418eJohannmem_put_be_aligned_generic(32) 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_le16_aligned 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_le16_aligned mem_ops_wrap_symbol(mem_put_le16_aligned) 1521b362b15af34006e6a11974088a46d42b903418eJohannmem_put_le_aligned_generic(16) 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_le32_aligned 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define mem_put_le32_aligned mem_ops_wrap_symbol(mem_put_le32_aligned) 1561b362b15af34006e6a11974088a46d42b903418eJohannmem_put_le_aligned_generic(32) 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_ne_aligned_generic 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_se_aligned_generic 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sne_aligned_generic 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_get_sse_aligned_generic 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_ne_aligned_generic 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef mem_put_se_aligned_generic 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef swap_endian_16 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef swap_endian_32 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef swap_endian_16_se 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef swap_endian_32_se 1682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif // VPX_PORTS_MEM_OPS_ALIGNED_H_ 170