1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libvpx/vpx_ports/mem_ops_aligned.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,157 @@ 1.4 +/* 1.5 + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license 1.8 + * that can be found in the LICENSE file in the root of the source 1.9 + * tree. An additional intellectual property rights grant can be found 1.10 + * in the file PATENTS. All contributing project authors may 1.11 + * be found in the AUTHORS file in the root of the source tree. 1.12 + */ 1.13 + 1.14 + 1.15 +/* \file 1.16 + * \brief Provides portable memory access primitives for operating on aligned 1.17 + * data 1.18 + * 1.19 + * This file is split from mem_ops.h for easier maintenance. See mem_ops.h 1.20 + * for a more detailed description of these primitives. 1.21 + */ 1.22 +#ifndef INCLUDED_BY_MEM_OPS_H 1.23 +#error Include mem_ops.h, not mem_ops_aligned.h directly. 1.24 +#endif 1.25 + 1.26 +/* Architectures that provide instructions for doing this byte swapping 1.27 + * could redefine these macros. 1.28 + */ 1.29 +#define swap_endian_16(val,raw) do {\ 1.30 + val = ((raw>>8) & 0x00ff) \ 1.31 + | ((raw<<8) & 0xff00);\ 1.32 + } while(0) 1.33 +#define swap_endian_32(val,raw) do {\ 1.34 + val = ((raw>>24) & 0x000000ff) \ 1.35 + | ((raw>>8) & 0x0000ff00) \ 1.36 + | ((raw<<8) & 0x00ff0000) \ 1.37 + | ((raw<<24) & 0xff000000); \ 1.38 + } while(0) 1.39 +#define swap_endian_16_se(val,raw) do {\ 1.40 + swap_endian_16(val,raw);\ 1.41 + val = ((val << 16) >> 16);\ 1.42 + } while(0) 1.43 +#define swap_endian_32_se(val,raw) swap_endian_32(val,raw) 1.44 + 1.45 +#define mem_get_ne_aligned_generic(end,sz) \ 1.46 + static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ 1.47 + const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ 1.48 + return *mem;\ 1.49 + } 1.50 + 1.51 +#define mem_get_sne_aligned_generic(end,sz) \ 1.52 + static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ 1.53 + const int##sz##_t *mem = (const int##sz##_t *)vmem;\ 1.54 + return *mem;\ 1.55 + } 1.56 + 1.57 +#define mem_get_se_aligned_generic(end,sz) \ 1.58 + static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ 1.59 + const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ 1.60 + unsigned MEM_VALUE_T val, raw = *mem;\ 1.61 + swap_endian_##sz(val,raw);\ 1.62 + return val;\ 1.63 + } 1.64 + 1.65 +#define mem_get_sse_aligned_generic(end,sz) \ 1.66 + static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ 1.67 + const int##sz##_t *mem = (const int##sz##_t *)vmem;\ 1.68 + unsigned MEM_VALUE_T val, raw = *mem;\ 1.69 + swap_endian_##sz##_se(val,raw);\ 1.70 + return val;\ 1.71 + } 1.72 + 1.73 +#define mem_put_ne_aligned_generic(end,sz) \ 1.74 + static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ 1.75 + uint##sz##_t *mem = (uint##sz##_t *)vmem;\ 1.76 + *mem = (uint##sz##_t)val;\ 1.77 + } 1.78 + 1.79 +#define mem_put_se_aligned_generic(end,sz) \ 1.80 + static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ 1.81 + uint##sz##_t *mem = (uint##sz##_t *)vmem, raw;\ 1.82 + swap_endian_##sz(raw,val);\ 1.83 + *mem = (uint##sz##_t)raw;\ 1.84 + } 1.85 + 1.86 +#include "vpx_config.h" 1.87 +#if CONFIG_BIG_ENDIAN 1.88 +#define mem_get_be_aligned_generic(sz) mem_get_ne_aligned_generic(be,sz) 1.89 +#define mem_get_sbe_aligned_generic(sz) mem_get_sne_aligned_generic(be,sz) 1.90 +#define mem_get_le_aligned_generic(sz) mem_get_se_aligned_generic(le,sz) 1.91 +#define mem_get_sle_aligned_generic(sz) mem_get_sse_aligned_generic(le,sz) 1.92 +#define mem_put_be_aligned_generic(sz) mem_put_ne_aligned_generic(be,sz) 1.93 +#define mem_put_le_aligned_generic(sz) mem_put_se_aligned_generic(le,sz) 1.94 +#else 1.95 +#define mem_get_be_aligned_generic(sz) mem_get_se_aligned_generic(be,sz) 1.96 +#define mem_get_sbe_aligned_generic(sz) mem_get_sse_aligned_generic(be,sz) 1.97 +#define mem_get_le_aligned_generic(sz) mem_get_ne_aligned_generic(le,sz) 1.98 +#define mem_get_sle_aligned_generic(sz) mem_get_sne_aligned_generic(le,sz) 1.99 +#define mem_put_be_aligned_generic(sz) mem_put_se_aligned_generic(be,sz) 1.100 +#define mem_put_le_aligned_generic(sz) mem_put_ne_aligned_generic(le,sz) 1.101 +#endif 1.102 + 1.103 +#undef mem_get_be16_aligned 1.104 +#define mem_get_be16_aligned mem_ops_wrap_symbol(mem_get_be16_aligned) 1.105 +mem_get_be_aligned_generic(16) 1.106 + 1.107 +#undef mem_get_be32_aligned 1.108 +#define mem_get_be32_aligned mem_ops_wrap_symbol(mem_get_be32_aligned) 1.109 +mem_get_be_aligned_generic(32) 1.110 + 1.111 +#undef mem_get_le16_aligned 1.112 +#define mem_get_le16_aligned mem_ops_wrap_symbol(mem_get_le16_aligned) 1.113 +mem_get_le_aligned_generic(16) 1.114 + 1.115 +#undef mem_get_le32_aligned 1.116 +#define mem_get_le32_aligned mem_ops_wrap_symbol(mem_get_le32_aligned) 1.117 +mem_get_le_aligned_generic(32) 1.118 + 1.119 +#undef mem_get_sbe16_aligned 1.120 +#define mem_get_sbe16_aligned mem_ops_wrap_symbol(mem_get_sbe16_aligned) 1.121 +mem_get_sbe_aligned_generic(16) 1.122 + 1.123 +#undef mem_get_sbe32_aligned 1.124 +#define mem_get_sbe32_aligned mem_ops_wrap_symbol(mem_get_sbe32_aligned) 1.125 +mem_get_sbe_aligned_generic(32) 1.126 + 1.127 +#undef mem_get_sle16_aligned 1.128 +#define mem_get_sle16_aligned mem_ops_wrap_symbol(mem_get_sle16_aligned) 1.129 +mem_get_sle_aligned_generic(16) 1.130 + 1.131 +#undef mem_get_sle32_aligned 1.132 +#define mem_get_sle32_aligned mem_ops_wrap_symbol(mem_get_sle32_aligned) 1.133 +mem_get_sle_aligned_generic(32) 1.134 + 1.135 +#undef mem_put_be16_aligned 1.136 +#define mem_put_be16_aligned mem_ops_wrap_symbol(mem_put_be16_aligned) 1.137 +mem_put_be_aligned_generic(16) 1.138 + 1.139 +#undef mem_put_be32_aligned 1.140 +#define mem_put_be32_aligned mem_ops_wrap_symbol(mem_put_be32_aligned) 1.141 +mem_put_be_aligned_generic(32) 1.142 + 1.143 +#undef mem_put_le16_aligned 1.144 +#define mem_put_le16_aligned mem_ops_wrap_symbol(mem_put_le16_aligned) 1.145 +mem_put_le_aligned_generic(16) 1.146 + 1.147 +#undef mem_put_le32_aligned 1.148 +#define mem_put_le32_aligned mem_ops_wrap_symbol(mem_put_le32_aligned) 1.149 +mem_put_le_aligned_generic(32) 1.150 + 1.151 +#undef mem_get_ne_aligned_generic 1.152 +#undef mem_get_se_aligned_generic 1.153 +#undef mem_get_sne_aligned_generic 1.154 +#undef mem_get_sse_aligned_generic 1.155 +#undef mem_put_ne_aligned_generic 1.156 +#undef mem_put_se_aligned_generic 1.157 +#undef swap_endian_16 1.158 +#undef swap_endian_32 1.159 +#undef swap_endian_16_se 1.160 +#undef swap_endian_32_se