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