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_H_ 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VPX_PORTS_MEM_OPS_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* \file 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan * \brief Provides portable memory access primitives 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This function provides portable primitives for getting and setting of 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan * signed and unsigned integers in 16, 24, and 32 bit sizes. The operations 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan * can be performed on unaligned data regardless of hardware support for 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan * unaligned accesses. 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The type used to pass the integral values may be changed by defining 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan * MEM_VALUE_T with the appropriate type. The type given must be an integral 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan * numeric type. 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan * The actual functions instantiated have the MEM_VALUE_T type name pasted 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan * on to the symbol name. This allows the developer to instantiate these 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan * operations for multiple types within the same translation unit. This is 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan * of somewhat questionable utility, but the capability exists nonetheless. 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Users not making use of this functionality should call the functions 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan * without the type name appended, and the preprocessor will take care of 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan * it. 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan * NOTE: This code is not supported on platforms where char > 1 octet ATM. 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef MAU_T 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Minimum Access Unit for this target */ 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAU_T unsigned char 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef MEM_VALUE_T 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MEM_VALUE_T int 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef MEM_VALUE_T_SZ_BITS 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MEM_VALUE_T_SZ_BITS (sizeof(MEM_VALUE_T) << 3) 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_ops_wrap_symbol 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_ops_wrap_symbol(fn) mem_ops_wrap_symbol2(fn, MEM_VALUE_T) 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_ops_wrap_symbol2 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_ops_wrap_symbol2(fn,typ) mem_ops_wrap_symbol3(fn,typ) 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_ops_wrap_symbol3 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_ops_wrap_symbol3(fn,typ) fn##_as_##typ 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Include aligned access routines 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define INCLUDED_BY_MEM_OPS_H 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "mem_ops_aligned.h" 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef INCLUDED_BY_MEM_OPS_H 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_be16 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be16 mem_ops_wrap_symbol(mem_get_be16) 65233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_be16(const void *vmem) { 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[0] << 8; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[1]; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_be24 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be24 mem_ops_wrap_symbol(mem_get_be24) 76233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_be24(const void *vmem) { 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[0] << 16; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[1] << 8; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[2]; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_be32 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_be32 mem_ops_wrap_symbol(mem_get_be32) 88233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_be32(const void *vmem) { 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[0] << 24; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[1] << 16; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[2] << 8; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[3]; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_le16 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le16 mem_ops_wrap_symbol(mem_get_le16) 101233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_le16(const void *vmem) { 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[1] << 8; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[0]; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_le24 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le24 mem_ops_wrap_symbol(mem_get_le24) 112233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_le24(const void *vmem) { 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[2] << 16; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[1] << 8; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[0]; 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_le32 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_le32 mem_ops_wrap_symbol(mem_get_le32) 124233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned MEM_VALUE_T mem_get_le32(const void *vmem) { 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned MEM_VALUE_T val; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T *)vmem; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan val = mem[3] << 24; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[2] << 16; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[1] << 8; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan val |= mem[0]; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan return val; 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_s_generic(end,sz) \ 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan static signed MEM_VALUE_T mem_get_s##end##sz(const void *vmem) {\ 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MAU_T *mem = (const MAU_T*)vmem;\ 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed MEM_VALUE_T val = mem_get_##end##sz(mem);\ 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (val << (MEM_VALUE_T_SZ_BITS - sz)) >> (MEM_VALUE_T_SZ_BITS - sz);\ 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sbe16 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe16 mem_ops_wrap_symbol(mem_get_sbe16) 144233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(be, 16) 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sbe24 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe24 mem_ops_wrap_symbol(mem_get_sbe24) 148233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(be, 24) 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sbe32 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sbe32 mem_ops_wrap_symbol(mem_get_sbe32) 152233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(be, 32) 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sle16 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle16 mem_ops_wrap_symbol(mem_get_sle16) 156233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(le, 16) 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sle24 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle24 mem_ops_wrap_symbol(mem_get_sle24) 160233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(le, 24) 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_get_sle32 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_get_sle32 mem_ops_wrap_symbol(mem_get_sle32) 164233d2500723e5594f3e7c70896ffeeef32b9c950ywanmem_get_s_generic(le, 32) 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_be16 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be16 mem_ops_wrap_symbol(mem_put_be16) 168233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_be16(void *vmem, MEM_VALUE_T val) { 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 8) & 0xff; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 0) & 0xff; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_be24 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be24 mem_ops_wrap_symbol(mem_put_be24) 177233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_be24(void *vmem, MEM_VALUE_T val) { 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 16) & 0xff; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 8) & 0xff; 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[2] = (val >> 0) & 0xff; 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_be32 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_be32 mem_ops_wrap_symbol(mem_put_be32) 187233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_be32(void *vmem, MEM_VALUE_T val) { 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 24) & 0xff; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 16) & 0xff; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[2] = (val >> 8) & 0xff; 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[3] = (val >> 0) & 0xff; 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_le16 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le16 mem_ops_wrap_symbol(mem_put_le16) 198233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_le16(void *vmem, MEM_VALUE_T val) { 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 0) & 0xff; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 8) & 0xff; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_le24 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le24 mem_ops_wrap_symbol(mem_put_le24) 207233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_le24(void *vmem, MEM_VALUE_T val) { 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 0) & 0xff; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 8) & 0xff; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[2] = (val >> 16) & 0xff; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef mem_put_le32 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define mem_put_le32 mem_ops_wrap_symbol(mem_put_le32) 217233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mem_put_le32(void *vmem, MEM_VALUE_T val) { 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAU_T *mem = (MAU_T *)vmem; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[0] = (val >> 0) & 0xff; 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[1] = (val >> 8) & 0xff; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[2] = (val >> 16) & 0xff; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan mem[3] = (val >> 24) & 0xff; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VPX_PORTS_MEM_OPS_H_ 227