OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 | 11 |
12 /* \file | 12 /* \file |
13 * \brief Provides portable memory access primitives for operating on aligned | 13 * \brief Provides portable memory access primitives for operating on aligned |
14 * data | 14 * data |
15 * | 15 * |
16 * This file is split from mem_ops.h for easier maintenance. See mem_ops.h | 16 * This file is split from mem_ops.h for easier maintenance. See mem_ops.h |
17 * for a more detailed description of these primitives. | 17 * for a more detailed description of these primitives. |
18 */ | 18 */ |
19 #ifndef INCLUDED_BY_MEM_OPS_H | 19 #ifndef INCLUDED_BY_MEM_OPS_H |
20 #error Include mem_ops.h, not mem_ops_aligned.h directly. | 20 #error Include mem_ops.h, not mem_ops_aligned.h directly. |
21 #endif | 21 #endif |
22 | 22 |
23 /* Architectures that provide instructions for doing this byte swapping | 23 /* Architectures that provide instructions for doing this byte swapping |
24 * could redefine these macros. | 24 * could redefine these macros. |
25 */ | 25 */ |
26 #define swap_endian_16(val,raw) do {\ | 26 #define swap_endian_16(val,raw) do {\ |
27 val = ((raw>>8) & 0x00ff) \ | 27 val = ((raw>>8) & 0x00ff) \ |
28 | ((raw<<8) & 0xff00);\ | 28 | ((raw<<8) & 0xff00);\ |
29 } while(0) | 29 } while(0) |
30 #define swap_endian_32(val,raw) do {\ | 30 #define swap_endian_32(val,raw) do {\ |
31 val = ((raw>>24) & 0x000000ff) \ | 31 val = ((raw>>24) & 0x000000ff) \ |
32 | ((raw>>8) & 0x0000ff00) \ | 32 | ((raw>>8) & 0x0000ff00) \ |
33 | ((raw<<8) & 0x00ff0000) \ | 33 | ((raw<<8) & 0x00ff0000) \ |
34 | ((raw<<24) & 0xff000000); \ | 34 | ((raw<<24) & 0xff000000); \ |
35 } while(0) | 35 } while(0) |
36 #define swap_endian_16_se(val,raw) do {\ | 36 #define swap_endian_16_se(val,raw) do {\ |
37 swap_endian_16(val,raw);\ | 37 swap_endian_16(val,raw);\ |
38 val = ((val << 16) >> 16);\ | 38 val = ((val << 16) >> 16);\ |
39 } while(0) | 39 } while(0) |
40 #define swap_endian_32_se(val,raw) swap_endian_32(val,raw) | 40 #define swap_endian_32_se(val,raw) swap_endian_32(val,raw) |
41 | 41 |
42 #define mem_get_ne_aligned_generic(end,sz) \ | 42 #define mem_get_ne_aligned_generic(end,sz) \ |
43 static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ | 43 static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ |
44 const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ | 44 const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ |
45 return *mem;\ | 45 return *mem;\ |
46 } | 46 } |
47 | 47 |
48 #define mem_get_sne_aligned_generic(end,sz) \ | 48 #define mem_get_sne_aligned_generic(end,sz) \ |
49 static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ | 49 static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ |
50 const int##sz##_t *mem = (const int##sz##_t *)vmem;\ | 50 const int##sz##_t *mem = (const int##sz##_t *)vmem;\ |
51 return *mem;\ | 51 return *mem;\ |
52 } | 52 } |
53 | 53 |
54 #define mem_get_se_aligned_generic(end,sz) \ | 54 #define mem_get_se_aligned_generic(end,sz) \ |
55 static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ | 55 static unsigned MEM_VALUE_T mem_get_##end##sz##_aligned(const void *vmem) {\ |
56 const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ | 56 const uint##sz##_t *mem = (const uint##sz##_t *)vmem;\ |
57 unsigned MEM_VALUE_T val, raw = *mem;\ | 57 unsigned MEM_VALUE_T val, raw = *mem;\ |
58 swap_endian_##sz(val,raw);\ | 58 swap_endian_##sz(val,raw);\ |
59 return val;\ | 59 return val;\ |
60 } | 60 } |
61 | 61 |
62 #define mem_get_sse_aligned_generic(end,sz) \ | 62 #define mem_get_sse_aligned_generic(end,sz) \ |
63 static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ | 63 static signed MEM_VALUE_T mem_get_s##end##sz##_aligned(const void *vmem) {\ |
64 const int##sz##_t *mem = (const int##sz##_t *)vmem;\ | 64 const int##sz##_t *mem = (const int##sz##_t *)vmem;\ |
65 unsigned MEM_VALUE_T val, raw = *mem;\ | 65 unsigned MEM_VALUE_T val, raw = *mem;\ |
66 swap_endian_##sz##_se(val,raw);\ | 66 swap_endian_##sz##_se(val,raw);\ |
67 return val;\ | 67 return val;\ |
68 } | 68 } |
69 | 69 |
70 #define mem_put_ne_aligned_generic(end,sz) \ | 70 #define mem_put_ne_aligned_generic(end,sz) \ |
71 static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ | 71 static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ |
72 uint##sz##_t *mem = (uint##sz##_t *)vmem;\ | 72 uint##sz##_t *mem = (uint##sz##_t *)vmem;\ |
73 *mem = (uint##sz##_t)val;\ | 73 *mem = (uint##sz##_t)val;\ |
74 } | 74 } |
75 | 75 |
76 #define mem_put_se_aligned_generic(end,sz) \ | 76 #define mem_put_se_aligned_generic(end,sz) \ |
77 static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ | 77 static void mem_put_##end##sz##_aligned(void *vmem, MEM_VALUE_T val) {\ |
78 uint##sz##_t *mem = (uint##sz##_t *)vmem, raw;\ | 78 uint##sz##_t *mem = (uint##sz##_t *)vmem, raw;\ |
79 swap_endian_##sz(raw,val);\ | 79 swap_endian_##sz(raw,val);\ |
80 *mem = (uint##sz##_t)raw;\ | 80 *mem = (uint##sz##_t)raw;\ |
81 } | 81 } |
82 | 82 |
83 #include "vpx_config.h" | 83 #include "vpx_config.h" |
84 #if CONFIG_BIG_ENDIAN | 84 #if CONFIG_BIG_ENDIAN |
85 #define mem_get_be_aligned_generic(sz) mem_get_ne_aligned_generic(be,sz) | 85 #define mem_get_be_aligned_generic(sz) mem_get_ne_aligned_generic(be,sz) |
86 #define mem_get_sbe_aligned_generic(sz) mem_get_sne_aligned_generic(be,sz) | 86 #define mem_get_sbe_aligned_generic(sz) mem_get_sne_aligned_generic(be,sz) |
87 #define mem_get_le_aligned_generic(sz) mem_get_se_aligned_generic(le,sz) | 87 #define mem_get_le_aligned_generic(sz) mem_get_se_aligned_generic(le,sz) |
88 #define mem_get_sle_aligned_generic(sz) mem_get_sse_aligned_generic(le,sz) | 88 #define mem_get_sle_aligned_generic(sz) mem_get_sse_aligned_generic(le,sz) |
89 #define mem_put_be_aligned_generic(sz) mem_put_ne_aligned_generic(be,sz) | 89 #define mem_put_be_aligned_generic(sz) mem_put_ne_aligned_generic(be,sz) |
90 #define mem_put_le_aligned_generic(sz) mem_put_se_aligned_generic(le,sz) | 90 #define mem_put_le_aligned_generic(sz) mem_put_se_aligned_generic(le,sz) |
91 #else | 91 #else |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 #undef mem_get_ne_aligned_generic | 148 #undef mem_get_ne_aligned_generic |
149 #undef mem_get_se_aligned_generic | 149 #undef mem_get_se_aligned_generic |
150 #undef mem_get_sne_aligned_generic | 150 #undef mem_get_sne_aligned_generic |
151 #undef mem_get_sse_aligned_generic | 151 #undef mem_get_sse_aligned_generic |
152 #undef mem_put_ne_aligned_generic | 152 #undef mem_put_ne_aligned_generic |
153 #undef mem_put_se_aligned_generic | 153 #undef mem_put_se_aligned_generic |
154 #undef swap_endian_16 | 154 #undef swap_endian_16 |
155 #undef swap_endian_32 | 155 #undef swap_endian_32 |
156 #undef swap_endian_16_se | 156 #undef swap_endian_16_se |
157 #undef swap_endian_32_se | 157 #undef swap_endian_32_se |
OLD | NEW |