[e16e8f2] | 1 | /* lzo_func.h -- functions |
---|
| 2 | |
---|
| 3 | This file is part of the LZO real-time data compression library. |
---|
| 4 | |
---|
| 5 | Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer |
---|
| 6 | All Rights Reserved. |
---|
| 7 | |
---|
| 8 | The LZO library is free software; you can redistribute it and/or |
---|
| 9 | modify it under the terms of the GNU General Public License as |
---|
| 10 | published by the Free Software Foundation; either version 2 of |
---|
| 11 | the License, or (at your option) any later version. |
---|
| 12 | |
---|
| 13 | The LZO library is distributed in the hope that it will be useful, |
---|
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 16 | GNU General Public License for more details. |
---|
| 17 | |
---|
| 18 | You should have received a copy of the GNU General Public License |
---|
| 19 | along with the LZO library; see the file COPYING. |
---|
| 20 | If not, write to the Free Software Foundation, Inc., |
---|
| 21 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
| 22 | |
---|
| 23 | Markus F.X.J. Oberhumer |
---|
| 24 | <markus@oberhumer.com> |
---|
| 25 | http://www.oberhumer.com/opensource/lzo/ |
---|
| 26 | */ |
---|
| 27 | |
---|
| 28 | |
---|
| 29 | /* WARNING: this file should *not* be used by applications. It is |
---|
| 30 | part of the implementation of the library and is subject |
---|
| 31 | to change. |
---|
| 32 | */ |
---|
| 33 | |
---|
| 34 | |
---|
| 35 | #ifndef __LZO_FUNC_H |
---|
| 36 | #define __LZO_FUNC_H 1 |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | /*********************************************************************** |
---|
| 40 | // bitops |
---|
| 41 | ************************************************************************/ |
---|
| 42 | |
---|
| 43 | #if !defined(LZO_BITOPS_USE_ASM_BITSCAN) && !defined(LZO_BITOPS_USE_GNUC_BITSCAN) && !defined(LZO_BITOPS_USE_MSC_BITSCAN) |
---|
| 44 | #if 1 && (LZO_ARCH_AMD64) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 45 | #define LZO_BITOPS_USE_ASM_BITSCAN 1 |
---|
| 46 | #elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC_GNUC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul)))) |
---|
| 47 | #define LZO_BITOPS_USE_GNUC_BITSCAN 1 |
---|
| 48 | #elif (LZO_OS_WIN32 || LZO_OS_WIN64) && ((LZO_CC_INTELC_MSC && (__INTEL_COMPILER >= 1010)) || (LZO_CC_MSC && (_MSC_VER >= 1400))) |
---|
| 49 | #define LZO_BITOPS_USE_MSC_BITSCAN 1 |
---|
| 50 | #if (LZO_CC_MSC) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) |
---|
| 51 | #include <intrin.h> |
---|
| 52 | #endif |
---|
| 53 | #if (LZO_CC_MSC) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) |
---|
| 54 | #pragma intrinsic(_BitScanReverse) |
---|
| 55 | #pragma intrinsic(_BitScanForward) |
---|
| 56 | #endif |
---|
| 57 | #if (LZO_CC_MSC) && (LZO_ARCH_AMD64) |
---|
| 58 | #pragma intrinsic(_BitScanReverse64) |
---|
| 59 | #pragma intrinsic(_BitScanForward64) |
---|
| 60 | #endif |
---|
| 61 | #endif |
---|
| 62 | #endif |
---|
| 63 | |
---|
| 64 | __lzo_static_forceinline unsigned lzo_bitops_ctlz32_func(lzo_uint32_t v) |
---|
| 65 | { |
---|
| 66 | #if (LZO_BITOPS_USE_MSC_BITSCAN) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) |
---|
| 67 | unsigned long r; (void) _BitScanReverse(&r, v); return (unsigned) r ^ 31; |
---|
| 68 | #define lzo_bitops_ctlz32(v) lzo_bitops_ctlz32_func(v) |
---|
| 69 | #elif (LZO_BITOPS_USE_ASM_BITSCAN) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 70 | lzo_uint32_t r; |
---|
| 71 | __asm__("bsr %1,%0" : "=r" (r) : "rm" (v) __LZO_ASM_CLOBBER_LIST_CC); |
---|
| 72 | return (unsigned) r ^ 31; |
---|
| 73 | #define lzo_bitops_ctlz32(v) lzo_bitops_ctlz32_func(v) |
---|
| 74 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_INT == 4) |
---|
| 75 | unsigned r; r = (unsigned) __builtin_clz(v); return r; |
---|
| 76 | #define lzo_bitops_ctlz32(v) ((unsigned) __builtin_clz(v)) |
---|
| 77 | #else |
---|
| 78 | LZO_UNUSED(v); return 0; |
---|
| 79 | #endif |
---|
| 80 | } |
---|
| 81 | |
---|
| 82 | #if defined(lzo_uint64_t) |
---|
| 83 | __lzo_static_forceinline unsigned lzo_bitops_ctlz64_func(lzo_uint64_t v) |
---|
| 84 | { |
---|
| 85 | #if (LZO_BITOPS_USE_MSC_BITSCAN) && (LZO_ARCH_AMD64) |
---|
| 86 | unsigned long r; (void) _BitScanReverse64(&r, v); return (unsigned) r ^ 63; |
---|
| 87 | #define lzo_bitops_ctlz64(v) lzo_bitops_ctlz64_func(v) |
---|
| 88 | #elif (LZO_BITOPS_USE_ASM_BITSCAN) && (LZO_ARCH_AMD64) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 89 | lzo_uint64_t r; |
---|
| 90 | __asm__("bsr %1,%0" : "=r" (r) : "rm" (v) __LZO_ASM_CLOBBER_LIST_CC); |
---|
| 91 | return (unsigned) r ^ 63; |
---|
| 92 | #define lzo_bitops_ctlz64(v) lzo_bitops_ctlz64_func(v) |
---|
| 93 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_LONG == 8) && (LZO_WORDSIZE >= 8) |
---|
| 94 | unsigned r; r = (unsigned) __builtin_clzl(v); return r; |
---|
| 95 | #define lzo_bitops_ctlz64(v) ((unsigned) __builtin_clzl(v)) |
---|
| 96 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_LONG_LONG == 8) && (LZO_WORDSIZE >= 8) |
---|
| 97 | unsigned r; r = (unsigned) __builtin_clzll(v); return r; |
---|
| 98 | #define lzo_bitops_ctlz64(v) ((unsigned) __builtin_clzll(v)) |
---|
| 99 | #else |
---|
| 100 | LZO_UNUSED(v); return 0; |
---|
| 101 | #endif |
---|
| 102 | } |
---|
| 103 | #endif |
---|
| 104 | |
---|
| 105 | __lzo_static_forceinline unsigned lzo_bitops_cttz32_func(lzo_uint32_t v) |
---|
| 106 | { |
---|
| 107 | #if (LZO_BITOPS_USE_MSC_BITSCAN) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) |
---|
| 108 | unsigned long r; (void) _BitScanForward(&r, v); return (unsigned) r; |
---|
| 109 | #define lzo_bitops_cttz32(v) lzo_bitops_cttz32_func(v) |
---|
| 110 | #elif (LZO_BITOPS_USE_ASM_BITSCAN) && (LZO_ARCH_AMD64 || LZO_ARCH_I386) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 111 | lzo_uint32_t r; |
---|
| 112 | __asm__("bsf %1,%0" : "=r" (r) : "rm" (v) __LZO_ASM_CLOBBER_LIST_CC); |
---|
| 113 | return (unsigned) r; |
---|
| 114 | #define lzo_bitops_cttz32(v) lzo_bitops_cttz32_func(v) |
---|
| 115 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_INT >= 4) |
---|
| 116 | unsigned r; r = (unsigned) __builtin_ctz(v); return r; |
---|
| 117 | #define lzo_bitops_cttz32(v) ((unsigned) __builtin_ctz(v)) |
---|
| 118 | #else |
---|
| 119 | LZO_UNUSED(v); return 0; |
---|
| 120 | #endif |
---|
| 121 | } |
---|
| 122 | |
---|
| 123 | #if defined(lzo_uint64_t) |
---|
| 124 | __lzo_static_forceinline unsigned lzo_bitops_cttz64_func(lzo_uint64_t v) |
---|
| 125 | { |
---|
| 126 | #if (LZO_BITOPS_USE_MSC_BITSCAN) && (LZO_ARCH_AMD64) |
---|
| 127 | unsigned long r; (void) _BitScanForward64(&r, v); return (unsigned) r; |
---|
| 128 | #define lzo_bitops_cttz64(v) lzo_bitops_cttz64_func(v) |
---|
| 129 | #elif (LZO_BITOPS_USE_ASM_BITSCAN) && (LZO_ARCH_AMD64) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 130 | lzo_uint64_t r; |
---|
| 131 | __asm__("bsf %1,%0" : "=r" (r) : "rm" (v) __LZO_ASM_CLOBBER_LIST_CC); |
---|
| 132 | return (unsigned) r; |
---|
| 133 | #define lzo_bitops_cttz64(v) lzo_bitops_cttz64_func(v) |
---|
| 134 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_LONG >= 8) && (LZO_WORDSIZE >= 8) |
---|
| 135 | unsigned r; r = (unsigned) __builtin_ctzl(v); return r; |
---|
| 136 | #define lzo_bitops_cttz64(v) ((unsigned) __builtin_ctzl(v)) |
---|
| 137 | #elif (LZO_BITOPS_USE_GNUC_BITSCAN) && (LZO_SIZEOF_LONG_LONG >= 8) && (LZO_WORDSIZE >= 8) |
---|
| 138 | unsigned r; r = (unsigned) __builtin_ctzll(v); return r; |
---|
| 139 | #define lzo_bitops_cttz64(v) ((unsigned) __builtin_ctzll(v)) |
---|
| 140 | #else |
---|
| 141 | LZO_UNUSED(v); return 0; |
---|
| 142 | #endif |
---|
| 143 | } |
---|
| 144 | #endif |
---|
| 145 | |
---|
| 146 | #if 1 && (LZO_CC_ARMCC_GNUC || LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_INTELC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) |
---|
| 147 | static void __attribute__((__unused__)) |
---|
| 148 | #else |
---|
| 149 | __lzo_static_forceinline void |
---|
| 150 | #endif |
---|
| 151 | lzo_bitops_unused_funcs(void) |
---|
| 152 | { |
---|
| 153 | LZO_UNUSED_FUNC(lzo_bitops_ctlz32_func); |
---|
| 154 | LZO_UNUSED_FUNC(lzo_bitops_cttz32_func); |
---|
| 155 | #if defined(lzo_uint64_t) |
---|
| 156 | LZO_UNUSED_FUNC(lzo_bitops_ctlz64_func); |
---|
| 157 | LZO_UNUSED_FUNC(lzo_bitops_cttz64_func); |
---|
| 158 | #endif |
---|
| 159 | LZO_UNUSED_FUNC(lzo_bitops_unused_funcs); |
---|
| 160 | } |
---|
| 161 | |
---|
| 162 | |
---|
| 163 | /*********************************************************************** |
---|
| 164 | // memops |
---|
| 165 | ************************************************************************/ |
---|
| 166 | |
---|
| 167 | #if defined(__lzo_alignof) && !(LZO_CFG_NO_UNALIGNED) |
---|
| 168 | #ifndef __lzo_memops_tcheck |
---|
| 169 | #define __lzo_memops_tcheck(t,a,b) ((void)0, sizeof(t) == (a) && __lzo_alignof(t) == (b)) |
---|
| 170 | #endif |
---|
| 171 | #endif |
---|
| 172 | #ifndef lzo_memops_TU0p |
---|
| 173 | #define lzo_memops_TU0p void __LZO_MMODEL * |
---|
| 174 | #endif |
---|
| 175 | #ifndef lzo_memops_TU1p |
---|
| 176 | #define lzo_memops_TU1p unsigned char __LZO_MMODEL * |
---|
| 177 | #endif |
---|
| 178 | #ifndef lzo_memops_TU2p |
---|
| 179 | #if (LZO_OPT_UNALIGNED16) |
---|
| 180 | typedef lzo_uint16_t __lzo_may_alias lzo_memops_TU2; |
---|
| 181 | #define lzo_memops_TU2p volatile lzo_memops_TU2 * |
---|
| 182 | #elif defined(__lzo_byte_struct) |
---|
| 183 | __lzo_byte_struct(lzo_memops_TU2_struct,2) |
---|
| 184 | typedef struct lzo_memops_TU2_struct lzo_memops_TU2; |
---|
| 185 | #else |
---|
| 186 | struct lzo_memops_TU2_struct { unsigned char a[2]; } __lzo_may_alias; |
---|
| 187 | typedef struct lzo_memops_TU2_struct lzo_memops_TU2; |
---|
| 188 | #endif |
---|
| 189 | #ifndef lzo_memops_TU2p |
---|
| 190 | #define lzo_memops_TU2p lzo_memops_TU2 * |
---|
| 191 | #endif |
---|
| 192 | #endif |
---|
| 193 | #ifndef lzo_memops_TU4p |
---|
| 194 | #if (LZO_OPT_UNALIGNED32) |
---|
| 195 | typedef lzo_uint32_t __lzo_may_alias lzo_memops_TU4; |
---|
| 196 | #define lzo_memops_TU4p volatile lzo_memops_TU4 __LZO_MMODEL * |
---|
| 197 | #elif defined(__lzo_byte_struct) |
---|
| 198 | __lzo_byte_struct(lzo_memops_TU4_struct,4) |
---|
| 199 | typedef struct lzo_memops_TU4_struct lzo_memops_TU4; |
---|
| 200 | #else |
---|
| 201 | struct lzo_memops_TU4_struct { unsigned char a[4]; } __lzo_may_alias; |
---|
| 202 | typedef struct lzo_memops_TU4_struct lzo_memops_TU4; |
---|
| 203 | #endif |
---|
| 204 | #ifndef lzo_memops_TU4p |
---|
| 205 | #define lzo_memops_TU4p lzo_memops_TU4 __LZO_MMODEL * |
---|
| 206 | #endif |
---|
| 207 | #endif |
---|
| 208 | #ifndef lzo_memops_TU8p |
---|
| 209 | #if (LZO_OPT_UNALIGNED64) |
---|
| 210 | typedef lzo_uint64_t __lzo_may_alias lzo_memops_TU8; |
---|
| 211 | #define lzo_memops_TU8p volatile lzo_memops_TU8 __LZO_MMODEL * |
---|
| 212 | #elif defined(__lzo_byte_struct) |
---|
| 213 | __lzo_byte_struct(lzo_memops_TU8_struct,8) |
---|
| 214 | typedef struct lzo_memops_TU8_struct lzo_memops_TU8; |
---|
| 215 | #else |
---|
| 216 | struct lzo_memops_TU8_struct { unsigned char a[8]; } __lzo_may_alias; |
---|
| 217 | typedef struct lzo_memops_TU8_struct lzo_memops_TU8; |
---|
| 218 | #endif |
---|
| 219 | #ifndef lzo_memops_TU8p |
---|
| 220 | #define lzo_memops_TU8p lzo_memops_TU8 __LZO_MMODEL * |
---|
| 221 | #endif |
---|
| 222 | #endif |
---|
| 223 | #ifndef lzo_memops_set_TU1p |
---|
| 224 | #define lzo_memops_set_TU1p volatile lzo_memops_TU1p |
---|
| 225 | #endif |
---|
| 226 | #ifndef lzo_memops_move_TU1p |
---|
| 227 | #define lzo_memops_move_TU1p lzo_memops_TU1p |
---|
| 228 | #endif |
---|
| 229 | #define LZO_MEMOPS_SET1(dd,cc) \ |
---|
| 230 | LZO_BLOCK_BEGIN \ |
---|
| 231 | lzo_memops_set_TU1p d__1 = (lzo_memops_set_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 232 | d__1[0] = LZO_BYTE(cc); \ |
---|
| 233 | LZO_BLOCK_END |
---|
| 234 | #define LZO_MEMOPS_SET2(dd,cc) \ |
---|
| 235 | LZO_BLOCK_BEGIN \ |
---|
| 236 | lzo_memops_set_TU1p d__2 = (lzo_memops_set_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 237 | d__2[0] = LZO_BYTE(cc); d__2[1] = LZO_BYTE(cc); \ |
---|
| 238 | LZO_BLOCK_END |
---|
| 239 | #define LZO_MEMOPS_SET3(dd,cc) \ |
---|
| 240 | LZO_BLOCK_BEGIN \ |
---|
| 241 | lzo_memops_set_TU1p d__3 = (lzo_memops_set_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 242 | d__3[0] = LZO_BYTE(cc); d__3[1] = LZO_BYTE(cc); d__3[2] = LZO_BYTE(cc); \ |
---|
| 243 | LZO_BLOCK_END |
---|
| 244 | #define LZO_MEMOPS_SET4(dd,cc) \ |
---|
| 245 | LZO_BLOCK_BEGIN \ |
---|
| 246 | lzo_memops_set_TU1p d__4 = (lzo_memops_set_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 247 | d__4[0] = LZO_BYTE(cc); d__4[1] = LZO_BYTE(cc); d__4[2] = LZO_BYTE(cc); d__4[3] = LZO_BYTE(cc); \ |
---|
| 248 | LZO_BLOCK_END |
---|
| 249 | #define LZO_MEMOPS_MOVE1(dd,ss) \ |
---|
| 250 | LZO_BLOCK_BEGIN \ |
---|
| 251 | lzo_memops_move_TU1p d__1 = (lzo_memops_move_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 252 | const lzo_memops_move_TU1p s__1 = (const lzo_memops_move_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 253 | d__1[0] = s__1[0]; \ |
---|
| 254 | LZO_BLOCK_END |
---|
| 255 | #define LZO_MEMOPS_MOVE2(dd,ss) \ |
---|
| 256 | LZO_BLOCK_BEGIN \ |
---|
| 257 | lzo_memops_move_TU1p d__2 = (lzo_memops_move_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 258 | const lzo_memops_move_TU1p s__2 = (const lzo_memops_move_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 259 | d__2[0] = s__2[0]; d__2[1] = s__2[1]; \ |
---|
| 260 | LZO_BLOCK_END |
---|
| 261 | #define LZO_MEMOPS_MOVE3(dd,ss) \ |
---|
| 262 | LZO_BLOCK_BEGIN \ |
---|
| 263 | lzo_memops_move_TU1p d__3 = (lzo_memops_move_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 264 | const lzo_memops_move_TU1p s__3 = (const lzo_memops_move_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 265 | d__3[0] = s__3[0]; d__3[1] = s__3[1]; d__3[2] = s__3[2]; \ |
---|
| 266 | LZO_BLOCK_END |
---|
| 267 | #define LZO_MEMOPS_MOVE4(dd,ss) \ |
---|
| 268 | LZO_BLOCK_BEGIN \ |
---|
| 269 | lzo_memops_move_TU1p d__4 = (lzo_memops_move_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 270 | const lzo_memops_move_TU1p s__4 = (const lzo_memops_move_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 271 | d__4[0] = s__4[0]; d__4[1] = s__4[1]; d__4[2] = s__4[2]; d__4[3] = s__4[3]; \ |
---|
| 272 | LZO_BLOCK_END |
---|
| 273 | #define LZO_MEMOPS_MOVE8(dd,ss) \ |
---|
| 274 | LZO_BLOCK_BEGIN \ |
---|
| 275 | lzo_memops_move_TU1p d__8 = (lzo_memops_move_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 276 | const lzo_memops_move_TU1p s__8 = (const lzo_memops_move_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 277 | d__8[0] = s__8[0]; d__8[1] = s__8[1]; d__8[2] = s__8[2]; d__8[3] = s__8[3]; \ |
---|
| 278 | d__8[4] = s__8[4]; d__8[5] = s__8[5]; d__8[6] = s__8[6]; d__8[7] = s__8[7]; \ |
---|
| 279 | LZO_BLOCK_END |
---|
| 280 | LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU1p)0)==1) |
---|
| 281 | #define LZO_MEMOPS_COPY1(dd,ss) LZO_MEMOPS_MOVE1(dd,ss) |
---|
| 282 | #if (LZO_OPT_UNALIGNED16) |
---|
| 283 | LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU2p)0)==2) |
---|
| 284 | #define LZO_MEMOPS_COPY2(dd,ss) \ |
---|
| 285 | * (lzo_memops_TU2p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU2p) (const lzo_memops_TU0p) (ss) |
---|
| 286 | #elif defined(__lzo_memops_tcheck) |
---|
| 287 | #define LZO_MEMOPS_COPY2(dd,ss) \ |
---|
| 288 | LZO_BLOCK_BEGIN if (__lzo_memops_tcheck(lzo_memops_TU2,2,1)) { \ |
---|
| 289 | * (lzo_memops_TU2p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU2p) (const lzo_memops_TU0p) (ss); \ |
---|
| 290 | } else { LZO_MEMOPS_MOVE2(dd,ss); } LZO_BLOCK_END |
---|
| 291 | #else |
---|
| 292 | #define LZO_MEMOPS_COPY2(dd,ss) LZO_MEMOPS_MOVE2(dd,ss) |
---|
| 293 | #endif |
---|
| 294 | #if (LZO_OPT_UNALIGNED32) |
---|
| 295 | LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU4p)0)==4) |
---|
| 296 | #define LZO_MEMOPS_COPY4(dd,ss) \ |
---|
| 297 | * (lzo_memops_TU4p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU4p) (const lzo_memops_TU0p) (ss) |
---|
| 298 | #elif defined(__lzo_memops_tcheck) |
---|
| 299 | #define LZO_MEMOPS_COPY4(dd,ss) \ |
---|
| 300 | LZO_BLOCK_BEGIN if (__lzo_memops_tcheck(lzo_memops_TU4,4,1)) { \ |
---|
| 301 | * (lzo_memops_TU4p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU4p) (const lzo_memops_TU0p) (ss); \ |
---|
| 302 | } else { LZO_MEMOPS_MOVE4(dd,ss); } LZO_BLOCK_END |
---|
| 303 | #else |
---|
| 304 | #define LZO_MEMOPS_COPY4(dd,ss) LZO_MEMOPS_MOVE4(dd,ss) |
---|
| 305 | #endif |
---|
| 306 | #if (LZO_WORDSIZE != 8) |
---|
| 307 | #define LZO_MEMOPS_COPY8(dd,ss) \ |
---|
| 308 | LZO_BLOCK_BEGIN LZO_MEMOPS_COPY4(dd,ss); LZO_MEMOPS_COPY4((lzo_memops_TU1p)(lzo_memops_TU0p)(dd)+4,(const lzo_memops_TU1p)(const lzo_memops_TU0p)(ss)+4); LZO_BLOCK_END |
---|
| 309 | #else |
---|
| 310 | #if (LZO_OPT_UNALIGNED64) |
---|
| 311 | LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU8p)0)==8) |
---|
| 312 | #define LZO_MEMOPS_COPY8(dd,ss) \ |
---|
| 313 | * (lzo_memops_TU8p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU8p) (const lzo_memops_TU0p) (ss) |
---|
| 314 | #elif (LZO_OPT_UNALIGNED32) |
---|
| 315 | #define LZO_MEMOPS_COPY8(dd,ss) \ |
---|
| 316 | LZO_BLOCK_BEGIN LZO_MEMOPS_COPY4(dd,ss); LZO_MEMOPS_COPY4((lzo_memops_TU1p)(lzo_memops_TU0p)(dd)+4,(const lzo_memops_TU1p)(const lzo_memops_TU0p)(ss)+4); LZO_BLOCK_END |
---|
| 317 | #elif defined(__lzo_memops_tcheck) |
---|
| 318 | #define LZO_MEMOPS_COPY8(dd,ss) \ |
---|
| 319 | LZO_BLOCK_BEGIN if (__lzo_memops_tcheck(lzo_memops_TU8,8,1)) { \ |
---|
| 320 | * (lzo_memops_TU8p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU8p) (const lzo_memops_TU0p) (ss); \ |
---|
| 321 | } else { LZO_MEMOPS_MOVE8(dd,ss); } LZO_BLOCK_END |
---|
| 322 | #else |
---|
| 323 | #define LZO_MEMOPS_COPY8(dd,ss) LZO_MEMOPS_MOVE8(dd,ss) |
---|
| 324 | #endif |
---|
| 325 | #endif |
---|
| 326 | #define LZO_MEMOPS_COPYN(dd,ss,nn) \ |
---|
| 327 | LZO_BLOCK_BEGIN \ |
---|
| 328 | lzo_memops_TU1p d__n = (lzo_memops_TU1p) (lzo_memops_TU0p) (dd); \ |
---|
| 329 | const lzo_memops_TU1p s__n = (const lzo_memops_TU1p) (const lzo_memops_TU0p) (ss); \ |
---|
| 330 | lzo_uint n__n = (nn); \ |
---|
| 331 | while ((void)0, n__n >= 8) { LZO_MEMOPS_COPY8(d__n, s__n); d__n += 8; s__n += 8; n__n -= 8; } \ |
---|
| 332 | if ((void)0, n__n >= 4) { LZO_MEMOPS_COPY4(d__n, s__n); d__n += 4; s__n += 4; n__n -= 4; } \ |
---|
| 333 | if ((void)0, n__n > 0) do { *d__n++ = *s__n++; } while (--n__n > 0); \ |
---|
| 334 | LZO_BLOCK_END |
---|
| 335 | |
---|
| 336 | __lzo_static_forceinline lzo_uint16_t lzo_memops_get_le16(const lzo_voidp ss) |
---|
| 337 | { |
---|
| 338 | lzo_uint16_t v; |
---|
| 339 | #if (LZO_ABI_LITTLE_ENDIAN) |
---|
| 340 | LZO_MEMOPS_COPY2(&v, ss); |
---|
| 341 | #elif (LZO_OPT_UNALIGNED16 && LZO_ARCH_POWERPC && LZO_ABI_BIG_ENDIAN) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 342 | const lzo_memops_TU2p s = (const lzo_memops_TU2p) ss; |
---|
| 343 | unsigned long vv; |
---|
| 344 | __asm__("lhbrx %0,0,%1" : "=r" (vv) : "r" (s), "m" (*s)); |
---|
| 345 | v = (lzo_uint16_t) vv; |
---|
| 346 | #else |
---|
| 347 | const lzo_memops_TU1p s = (const lzo_memops_TU1p) ss; |
---|
| 348 | v = (lzo_uint16_t) (((lzo_uint16_t)s[0]) | ((lzo_uint16_t)s[1] << 8)); |
---|
| 349 | #endif |
---|
| 350 | return v; |
---|
| 351 | } |
---|
| 352 | #if (LZO_OPT_UNALIGNED16) && (LZO_ABI_LITTLE_ENDIAN) |
---|
| 353 | #define LZO_MEMOPS_GET_LE16(ss) * (const lzo_memops_TU2p) (const lzo_memops_TU0p) (ss) |
---|
| 354 | #else |
---|
| 355 | #define LZO_MEMOPS_GET_LE16(ss) lzo_memops_get_le16(ss) |
---|
| 356 | #endif |
---|
| 357 | |
---|
| 358 | __lzo_static_forceinline lzo_uint32_t lzo_memops_get_le32(const lzo_voidp ss) |
---|
| 359 | { |
---|
| 360 | lzo_uint32_t v; |
---|
| 361 | #if (LZO_ABI_LITTLE_ENDIAN) |
---|
| 362 | LZO_MEMOPS_COPY4(&v, ss); |
---|
| 363 | #elif (LZO_OPT_UNALIGNED32 && LZO_ARCH_POWERPC && LZO_ABI_BIG_ENDIAN) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 364 | const lzo_memops_TU4p s = (const lzo_memops_TU4p) ss; |
---|
| 365 | unsigned long vv; |
---|
| 366 | __asm__("lwbrx %0,0,%1" : "=r" (vv) : "r" (s), "m" (*s)); |
---|
| 367 | v = (lzo_uint32_t) vv; |
---|
| 368 | #else |
---|
| 369 | const lzo_memops_TU1p s = (const lzo_memops_TU1p) ss; |
---|
| 370 | v = (lzo_uint32_t) (((lzo_uint32_t)s[0] << 24) | ((lzo_uint32_t)s[1] << 16) | ((lzo_uint32_t)s[2] << 8) | ((lzo_uint32_t)s[3])); |
---|
| 371 | #endif |
---|
| 372 | return v; |
---|
| 373 | } |
---|
| 374 | #if (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN) |
---|
| 375 | #define LZO_MEMOPS_GET_LE32(ss) * (const lzo_memops_TU4p) (const lzo_memops_TU0p) (ss) |
---|
| 376 | #else |
---|
| 377 | #define LZO_MEMOPS_GET_LE32(ss) lzo_memops_get_le32(ss) |
---|
| 378 | #endif |
---|
| 379 | |
---|
| 380 | #if (LZO_OPT_UNALIGNED64) && (LZO_ABI_LITTLE_ENDIAN) |
---|
| 381 | #define LZO_MEMOPS_GET_LE64(ss) * (const lzo_memops_TU8p) (const lzo_memops_TU0p) (ss) |
---|
| 382 | #endif |
---|
| 383 | |
---|
| 384 | __lzo_static_forceinline lzo_uint16_t lzo_memops_get_ne16(const lzo_voidp ss) |
---|
| 385 | { |
---|
| 386 | lzo_uint16_t v; |
---|
| 387 | LZO_MEMOPS_COPY2(&v, ss); |
---|
| 388 | return v; |
---|
| 389 | } |
---|
| 390 | #if (LZO_OPT_UNALIGNED16) |
---|
| 391 | #define LZO_MEMOPS_GET_NE16(ss) * (const lzo_memops_TU2p) (const lzo_memops_TU0p) (ss) |
---|
| 392 | #else |
---|
| 393 | #define LZO_MEMOPS_GET_NE16(ss) lzo_memops_get_ne16(ss) |
---|
| 394 | #endif |
---|
| 395 | |
---|
| 396 | __lzo_static_forceinline lzo_uint32_t lzo_memops_get_ne32(const lzo_voidp ss) |
---|
| 397 | { |
---|
| 398 | lzo_uint32_t v; |
---|
| 399 | LZO_MEMOPS_COPY4(&v, ss); |
---|
| 400 | return v; |
---|
| 401 | } |
---|
| 402 | #if (LZO_OPT_UNALIGNED32) |
---|
| 403 | #define LZO_MEMOPS_GET_NE32(ss) * (const lzo_memops_TU4p) (const lzo_memops_TU0p) (ss) |
---|
| 404 | #else |
---|
| 405 | #define LZO_MEMOPS_GET_NE32(ss) lzo_memops_get_ne32(ss) |
---|
| 406 | #endif |
---|
| 407 | |
---|
| 408 | #if (LZO_OPT_UNALIGNED64) |
---|
| 409 | #define LZO_MEMOPS_GET_NE64(ss) * (const lzo_memops_TU8p) (const lzo_memops_TU0p) (ss) |
---|
| 410 | #endif |
---|
| 411 | |
---|
| 412 | __lzo_static_forceinline void lzo_memops_put_le16(lzo_voidp dd, lzo_uint16_t vv) |
---|
| 413 | { |
---|
| 414 | #if (LZO_ABI_LITTLE_ENDIAN) |
---|
| 415 | LZO_MEMOPS_COPY2(dd, &vv); |
---|
| 416 | #elif (LZO_OPT_UNALIGNED16 && LZO_ARCH_POWERPC && LZO_ABI_BIG_ENDIAN) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 417 | lzo_memops_TU2p d = (lzo_memops_TU2p) dd; |
---|
| 418 | unsigned long v = vv; |
---|
| 419 | __asm__("sthbrx %2,0,%1" : "=m" (*d) : "r" (d), "r" (v)); |
---|
| 420 | #else |
---|
| 421 | lzo_memops_TU1p d = (lzo_memops_TU1p) dd; |
---|
| 422 | d[0] = LZO_BYTE((vv ) & 0xff); |
---|
| 423 | d[1] = LZO_BYTE((vv >> 8) & 0xff); |
---|
| 424 | #endif |
---|
| 425 | } |
---|
| 426 | #if (LZO_OPT_UNALIGNED16) && (LZO_ABI_LITTLE_ENDIAN) |
---|
| 427 | #define LZO_MEMOPS_PUT_LE16(dd,vv) (* (lzo_memops_TU2p) (lzo_memops_TU0p) (dd) = (vv)) |
---|
| 428 | #else |
---|
| 429 | #define LZO_MEMOPS_PUT_LE16(dd,vv) lzo_memops_put_le16(dd,vv) |
---|
| 430 | #endif |
---|
| 431 | |
---|
| 432 | __lzo_static_forceinline void lzo_memops_put_le32(lzo_voidp dd, lzo_uint32_t vv) |
---|
| 433 | { |
---|
| 434 | #if (LZO_ABI_LITTLE_ENDIAN) |
---|
| 435 | LZO_MEMOPS_COPY4(dd, &vv); |
---|
| 436 | #elif (LZO_OPT_UNALIGNED32 && LZO_ARCH_POWERPC && LZO_ABI_BIG_ENDIAN) && (LZO_ASM_SYNTAX_GNUC) |
---|
| 437 | lzo_memops_TU4p d = (lzo_memops_TU4p) dd; |
---|
| 438 | unsigned long v = vv; |
---|
| 439 | __asm__("stwbrx %2,0,%1" : "=m" (*d) : "r" (d), "r" (v)); |
---|
| 440 | #else |
---|
| 441 | lzo_memops_TU1p d = (lzo_memops_TU1p) dd; |
---|
| 442 | d[0] = LZO_BYTE((vv ) & 0xff); |
---|
| 443 | d[1] = LZO_BYTE((vv >> 8) & 0xff); |
---|
| 444 | d[2] = LZO_BYTE((vv >> 16) & 0xff); |
---|
| 445 | d[3] = LZO_BYTE((vv >> 24) & 0xff); |
---|
| 446 | #endif |
---|
| 447 | } |
---|
| 448 | #if (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN) |
---|
| 449 | #define LZO_MEMOPS_PUT_LE32(dd,vv) (* (lzo_memops_TU4p) (lzo_memops_TU0p) (dd) = (vv)) |
---|
| 450 | #else |
---|
| 451 | #define LZO_MEMOPS_PUT_LE32(dd,vv) lzo_memops_put_le32(dd,vv) |
---|
| 452 | #endif |
---|
| 453 | |
---|
| 454 | __lzo_static_forceinline void lzo_memops_put_ne16(lzo_voidp dd, lzo_uint16_t vv) |
---|
| 455 | { |
---|
| 456 | LZO_MEMOPS_COPY2(dd, &vv); |
---|
| 457 | } |
---|
| 458 | #if (LZO_OPT_UNALIGNED16) |
---|
| 459 | #define LZO_MEMOPS_PUT_NE16(dd,vv) (* (lzo_memops_TU2p) (lzo_memops_TU0p) (dd) = (vv)) |
---|
| 460 | #else |
---|
| 461 | #define LZO_MEMOPS_PUT_NE16(dd,vv) lzo_memops_put_ne16(dd,vv) |
---|
| 462 | #endif |
---|
| 463 | |
---|
| 464 | __lzo_static_forceinline void lzo_memops_put_ne32(lzo_voidp dd, lzo_uint32_t vv) |
---|
| 465 | { |
---|
| 466 | LZO_MEMOPS_COPY4(dd, &vv); |
---|
| 467 | } |
---|
| 468 | #if (LZO_OPT_UNALIGNED32) |
---|
| 469 | #define LZO_MEMOPS_PUT_NE32(dd,vv) (* (lzo_memops_TU4p) (lzo_memops_TU0p) (dd) = (vv)) |
---|
| 470 | #else |
---|
| 471 | #define LZO_MEMOPS_PUT_NE32(dd,vv) lzo_memops_put_ne32(dd,vv) |
---|
| 472 | #endif |
---|
| 473 | |
---|
| 474 | #if 1 && (LZO_CC_ARMCC_GNUC || LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_INTELC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) |
---|
| 475 | static void __attribute__((__unused__)) |
---|
| 476 | #else |
---|
| 477 | __lzo_static_forceinline void |
---|
| 478 | #endif |
---|
| 479 | lzo_memops_unused_funcs(void) |
---|
| 480 | { |
---|
| 481 | LZO_UNUSED_FUNC(lzo_memops_get_le16); |
---|
| 482 | LZO_UNUSED_FUNC(lzo_memops_get_le32); |
---|
| 483 | LZO_UNUSED_FUNC(lzo_memops_get_ne16); |
---|
| 484 | LZO_UNUSED_FUNC(lzo_memops_get_ne32); |
---|
| 485 | LZO_UNUSED_FUNC(lzo_memops_put_le16); |
---|
| 486 | LZO_UNUSED_FUNC(lzo_memops_put_le32); |
---|
| 487 | LZO_UNUSED_FUNC(lzo_memops_put_ne16); |
---|
| 488 | LZO_UNUSED_FUNC(lzo_memops_put_ne32); |
---|
| 489 | LZO_UNUSED_FUNC(lzo_memops_unused_funcs); |
---|
| 490 | } |
---|
| 491 | |
---|
| 492 | #endif /* already included */ |
---|
| 493 | |
---|
| 494 | /* vim:set ts=4 sw=4 et: */ |
---|