/src/aom/aom_util/endian_inl.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2016, Alliance for Open Media. All rights reserved. |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 2 Clause License and |
5 | | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
6 | | * was not distributed with this source code in the LICENSE file, you can |
7 | | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
8 | | * Media Patent License 1.0 was not distributed with this source code in the |
9 | | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
10 | | */ |
11 | | // |
12 | | // Endian related functions. |
13 | | |
14 | | #ifndef AOM_AOM_UTIL_ENDIAN_INL_H_ |
15 | | #define AOM_AOM_UTIL_ENDIAN_INL_H_ |
16 | | |
17 | | #include <stdlib.h> |
18 | | |
19 | | #include "config/aom_config.h" |
20 | | |
21 | | #include "aom/aom_integer.h" |
22 | | |
23 | | #if defined(__GNUC__) |
24 | | #define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__) |
25 | | #define LOCAL_GCC_PREREQ(maj, min) (LOCAL_GCC_VERSION >= (((maj) << 8) | (min))) |
26 | | #else |
27 | | #define LOCAL_GCC_VERSION 0 |
28 | | #define LOCAL_GCC_PREREQ(maj, min) 0 |
29 | | #endif |
30 | | |
31 | | // handle clang compatibility |
32 | | #ifndef __has_builtin |
33 | | #define __has_builtin(x) 0 |
34 | | #endif |
35 | | |
36 | | // some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__) |
37 | | #if !defined(WORDS_BIGENDIAN) && \ |
38 | | (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \ |
39 | | (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))) |
40 | | #define WORDS_BIGENDIAN |
41 | | #endif |
42 | | |
43 | | #if defined(WORDS_BIGENDIAN) |
44 | | #define HToLE32 BSwap32 |
45 | | #define HToLE16 BSwap16 |
46 | | #define HToBE64(x) (x) |
47 | | #define HToBE32(x) (x) |
48 | | #else |
49 | | #define HToLE32(x) (x) |
50 | | #define HToLE16(x) (x) |
51 | 0 | #define HToBE64(X) BSwap64(X) |
52 | | #define HToBE32(X) BSwap32(X) |
53 | | #endif |
54 | | |
55 | | #if LOCAL_GCC_PREREQ(4, 8) || __has_builtin(__builtin_bswap16) |
56 | | #define HAVE_BUILTIN_BSWAP16 |
57 | | #endif |
58 | | |
59 | | #if LOCAL_GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap32) |
60 | | #define HAVE_BUILTIN_BSWAP32 |
61 | | #endif |
62 | | |
63 | | #if LOCAL_GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap64) |
64 | | #define HAVE_BUILTIN_BSWAP64 |
65 | | #endif |
66 | | |
67 | 0 | static inline uint16_t BSwap16(uint16_t x) { |
68 | 0 | #if defined(HAVE_BUILTIN_BSWAP16) |
69 | 0 | return __builtin_bswap16(x); |
70 | 0 | #elif defined(_MSC_VER) |
71 | 0 | return _byteswap_ushort(x); |
72 | 0 | #else |
73 | 0 | // gcc will recognize a 'rorw $8, ...' here: |
74 | 0 | return (x >> 8) | ((x & 0xff) << 8); |
75 | 0 | #endif // HAVE_BUILTIN_BSWAP16 |
76 | 0 | } Unexecuted instantiation: av1_cx_iface.c:BSwap16 Unexecuted instantiation: allintra_vis.c:BSwap16 Unexecuted instantiation: av1_quantize.c:BSwap16 Unexecuted instantiation: bitstream.c:BSwap16 Unexecuted instantiation: context_tree.c:BSwap16 Unexecuted instantiation: encodeframe.c:BSwap16 Unexecuted instantiation: encodeframe_utils.c:BSwap16 Unexecuted instantiation: encodemb.c:BSwap16 Unexecuted instantiation: encodemv.c:BSwap16 Unexecuted instantiation: encoder.c:BSwap16 Unexecuted instantiation: encoder_utils.c:BSwap16 Unexecuted instantiation: encodetxb.c:BSwap16 Unexecuted instantiation: ethread.c:BSwap16 Unexecuted instantiation: firstpass.c:BSwap16 Unexecuted instantiation: global_motion_facade.c:BSwap16 Unexecuted instantiation: level.c:BSwap16 Unexecuted instantiation: lookahead.c:BSwap16 Unexecuted instantiation: mcomp.c:BSwap16 Unexecuted instantiation: mv_prec.c:BSwap16 Unexecuted instantiation: palette.c:BSwap16 Unexecuted instantiation: partition_search.c:BSwap16 Unexecuted instantiation: partition_strategy.c:BSwap16 Unexecuted instantiation: pass2_strategy.c:BSwap16 Unexecuted instantiation: pickcdef.c:BSwap16 Unexecuted instantiation: picklpf.c:BSwap16 Unexecuted instantiation: pickrst.c:BSwap16 Unexecuted instantiation: ratectrl.c:BSwap16 Unexecuted instantiation: rd.c:BSwap16 Unexecuted instantiation: rdopt.c:BSwap16 Unexecuted instantiation: nonrd_pickmode.c:BSwap16 Unexecuted instantiation: nonrd_opt.c:BSwap16 Unexecuted instantiation: segmentation.c:BSwap16 Unexecuted instantiation: speed_features.c:BSwap16 Unexecuted instantiation: superres_scale.c:BSwap16 Unexecuted instantiation: svc_layercontext.c:BSwap16 Unexecuted instantiation: temporal_filter.c:BSwap16 Unexecuted instantiation: tokenize.c:BSwap16 Unexecuted instantiation: tpl_model.c:BSwap16 Unexecuted instantiation: tx_search.c:BSwap16 Unexecuted instantiation: txb_rdopt.c:BSwap16 Unexecuted instantiation: intra_mode_search.c:BSwap16 Unexecuted instantiation: var_based_part.c:BSwap16 Unexecuted instantiation: av1_noise_estimate.c:BSwap16 Unexecuted instantiation: bitwriter.c:BSwap16 Unexecuted instantiation: entenc.c:BSwap16 Unexecuted instantiation: binary_codes_writer.c:BSwap16 Unexecuted instantiation: aq_complexity.c:BSwap16 Unexecuted instantiation: aq_cyclicrefresh.c:BSwap16 Unexecuted instantiation: aq_variance.c:BSwap16 Unexecuted instantiation: compound_type.c:BSwap16 Unexecuted instantiation: encode_strategy.c:BSwap16 Unexecuted instantiation: global_motion.c:BSwap16 Unexecuted instantiation: gop_structure.c:BSwap16 Unexecuted instantiation: interp_search.c:BSwap16 Unexecuted instantiation: motion_search_facade.c:BSwap16 |
77 | | |
78 | 0 | static inline uint32_t BSwap32(uint32_t x) { |
79 | 0 | #if defined(HAVE_BUILTIN_BSWAP32) |
80 | 0 | return __builtin_bswap32(x); |
81 | 0 | #elif defined(__i386__) || defined(__x86_64__) |
82 | 0 | uint32_t swapped_bytes; |
83 | 0 | __asm__ volatile("bswap %0" : "=r"(swapped_bytes) : "0"(x)); |
84 | 0 | return swapped_bytes; |
85 | 0 | #elif defined(_MSC_VER) |
86 | 0 | return (uint32_t)_byteswap_ulong(x); |
87 | 0 | #else |
88 | 0 | return (x >> 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x << 24); |
89 | 0 | #endif // HAVE_BUILTIN_BSWAP32 |
90 | 0 | } Unexecuted instantiation: av1_cx_iface.c:BSwap32 Unexecuted instantiation: allintra_vis.c:BSwap32 Unexecuted instantiation: av1_quantize.c:BSwap32 Unexecuted instantiation: bitstream.c:BSwap32 Unexecuted instantiation: context_tree.c:BSwap32 Unexecuted instantiation: encodeframe.c:BSwap32 Unexecuted instantiation: encodeframe_utils.c:BSwap32 Unexecuted instantiation: encodemb.c:BSwap32 Unexecuted instantiation: encodemv.c:BSwap32 Unexecuted instantiation: encoder.c:BSwap32 Unexecuted instantiation: encoder_utils.c:BSwap32 Unexecuted instantiation: encodetxb.c:BSwap32 Unexecuted instantiation: ethread.c:BSwap32 Unexecuted instantiation: firstpass.c:BSwap32 Unexecuted instantiation: global_motion_facade.c:BSwap32 Unexecuted instantiation: level.c:BSwap32 Unexecuted instantiation: lookahead.c:BSwap32 Unexecuted instantiation: mcomp.c:BSwap32 Unexecuted instantiation: mv_prec.c:BSwap32 Unexecuted instantiation: palette.c:BSwap32 Unexecuted instantiation: partition_search.c:BSwap32 Unexecuted instantiation: partition_strategy.c:BSwap32 Unexecuted instantiation: pass2_strategy.c:BSwap32 Unexecuted instantiation: pickcdef.c:BSwap32 Unexecuted instantiation: picklpf.c:BSwap32 Unexecuted instantiation: pickrst.c:BSwap32 Unexecuted instantiation: ratectrl.c:BSwap32 Unexecuted instantiation: rd.c:BSwap32 Unexecuted instantiation: rdopt.c:BSwap32 Unexecuted instantiation: nonrd_pickmode.c:BSwap32 Unexecuted instantiation: nonrd_opt.c:BSwap32 Unexecuted instantiation: segmentation.c:BSwap32 Unexecuted instantiation: speed_features.c:BSwap32 Unexecuted instantiation: superres_scale.c:BSwap32 Unexecuted instantiation: svc_layercontext.c:BSwap32 Unexecuted instantiation: temporal_filter.c:BSwap32 Unexecuted instantiation: tokenize.c:BSwap32 Unexecuted instantiation: tpl_model.c:BSwap32 Unexecuted instantiation: tx_search.c:BSwap32 Unexecuted instantiation: txb_rdopt.c:BSwap32 Unexecuted instantiation: intra_mode_search.c:BSwap32 Unexecuted instantiation: var_based_part.c:BSwap32 Unexecuted instantiation: av1_noise_estimate.c:BSwap32 Unexecuted instantiation: bitwriter.c:BSwap32 Unexecuted instantiation: entenc.c:BSwap32 Unexecuted instantiation: binary_codes_writer.c:BSwap32 Unexecuted instantiation: aq_complexity.c:BSwap32 Unexecuted instantiation: aq_cyclicrefresh.c:BSwap32 Unexecuted instantiation: aq_variance.c:BSwap32 Unexecuted instantiation: compound_type.c:BSwap32 Unexecuted instantiation: encode_strategy.c:BSwap32 Unexecuted instantiation: global_motion.c:BSwap32 Unexecuted instantiation: gop_structure.c:BSwap32 Unexecuted instantiation: interp_search.c:BSwap32 Unexecuted instantiation: motion_search_facade.c:BSwap32 |
91 | | |
92 | 0 | static inline uint64_t BSwap64(uint64_t x) { |
93 | 0 | #if defined(HAVE_BUILTIN_BSWAP64) |
94 | 0 | return __builtin_bswap64(x); |
95 | | #elif defined(__x86_64__) |
96 | | uint64_t swapped_bytes; |
97 | | __asm__ volatile("bswapq %0" : "=r"(swapped_bytes) : "0"(x)); |
98 | | return swapped_bytes; |
99 | | #elif defined(_MSC_VER) |
100 | | return (uint64_t)_byteswap_uint64(x); |
101 | | #else // generic code for swapping 64-bit values (suggested by bdb@) |
102 | | x = ((x & 0xffffffff00000000ull) >> 32) | ((x & 0x00000000ffffffffull) << 32); |
103 | | x = ((x & 0xffff0000ffff0000ull) >> 16) | ((x & 0x0000ffff0000ffffull) << 16); |
104 | | x = ((x & 0xff00ff00ff00ff00ull) >> 8) | ((x & 0x00ff00ff00ff00ffull) << 8); |
105 | | return x; |
106 | | #endif // HAVE_BUILTIN_BSWAP64 |
107 | 0 | } Unexecuted instantiation: av1_cx_iface.c:BSwap64 Unexecuted instantiation: allintra_vis.c:BSwap64 Unexecuted instantiation: av1_quantize.c:BSwap64 Unexecuted instantiation: bitstream.c:BSwap64 Unexecuted instantiation: context_tree.c:BSwap64 Unexecuted instantiation: encodeframe.c:BSwap64 Unexecuted instantiation: encodeframe_utils.c:BSwap64 Unexecuted instantiation: encodemb.c:BSwap64 Unexecuted instantiation: encodemv.c:BSwap64 Unexecuted instantiation: encoder.c:BSwap64 Unexecuted instantiation: encoder_utils.c:BSwap64 Unexecuted instantiation: encodetxb.c:BSwap64 Unexecuted instantiation: ethread.c:BSwap64 Unexecuted instantiation: firstpass.c:BSwap64 Unexecuted instantiation: global_motion_facade.c:BSwap64 Unexecuted instantiation: level.c:BSwap64 Unexecuted instantiation: lookahead.c:BSwap64 Unexecuted instantiation: mcomp.c:BSwap64 Unexecuted instantiation: mv_prec.c:BSwap64 Unexecuted instantiation: palette.c:BSwap64 Unexecuted instantiation: partition_search.c:BSwap64 Unexecuted instantiation: partition_strategy.c:BSwap64 Unexecuted instantiation: pass2_strategy.c:BSwap64 Unexecuted instantiation: pickcdef.c:BSwap64 Unexecuted instantiation: picklpf.c:BSwap64 Unexecuted instantiation: pickrst.c:BSwap64 Unexecuted instantiation: ratectrl.c:BSwap64 Unexecuted instantiation: rd.c:BSwap64 Unexecuted instantiation: rdopt.c:BSwap64 Unexecuted instantiation: nonrd_pickmode.c:BSwap64 Unexecuted instantiation: nonrd_opt.c:BSwap64 Unexecuted instantiation: segmentation.c:BSwap64 Unexecuted instantiation: speed_features.c:BSwap64 Unexecuted instantiation: superres_scale.c:BSwap64 Unexecuted instantiation: svc_layercontext.c:BSwap64 Unexecuted instantiation: temporal_filter.c:BSwap64 Unexecuted instantiation: tokenize.c:BSwap64 Unexecuted instantiation: tpl_model.c:BSwap64 Unexecuted instantiation: tx_search.c:BSwap64 Unexecuted instantiation: txb_rdopt.c:BSwap64 Unexecuted instantiation: intra_mode_search.c:BSwap64 Unexecuted instantiation: var_based_part.c:BSwap64 Unexecuted instantiation: av1_noise_estimate.c:BSwap64 Unexecuted instantiation: bitwriter.c:BSwap64 Unexecuted instantiation: entenc.c:BSwap64 Unexecuted instantiation: binary_codes_writer.c:BSwap64 Unexecuted instantiation: aq_complexity.c:BSwap64 Unexecuted instantiation: aq_cyclicrefresh.c:BSwap64 Unexecuted instantiation: aq_variance.c:BSwap64 Unexecuted instantiation: compound_type.c:BSwap64 Unexecuted instantiation: encode_strategy.c:BSwap64 Unexecuted instantiation: global_motion.c:BSwap64 Unexecuted instantiation: gop_structure.c:BSwap64 Unexecuted instantiation: interp_search.c:BSwap64 Unexecuted instantiation: motion_search_facade.c:BSwap64 |
108 | | |
109 | | #endif // AOM_AOM_UTIL_ENDIAN_INL_H_ |