1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_SYSTEMDEPENDENT_H_ 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_SYSTEMDEPENDENT_H_ 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef _MSC_VER 15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# include <math.h> // the ceil() definition must precede intrin.h 16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# if _MSC_VER > 1310 && (defined(_M_X64) || defined(_M_IX86)) 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# include <intrin.h> 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# define USE_MSC_INTRIN 19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# endif 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian# define snprintf _snprintf 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if ARCH_X86 || ARCH_X86_64 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vpx_reset_mmx_state(void); 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define vp9_clear_system_state() vpx_reset_mmx_state() 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define vp9_clear_system_state() 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(_MSC_VER) && _MSC_VER < 1800 365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// round is not defined in MSVC before VS2013. 37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int round(double x) { 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x < 0) 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (int)ceil(x - 0.5); 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (int)floor(x + 0.5); 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// use GNU builtins where available. 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if defined(__GNUC__) && \ 47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) 48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int get_msb(unsigned int n) { 49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return 31 ^ __builtin_clz(n); 50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#elif defined(USE_MSC_INTRIN) 52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#pragma intrinsic(_BitScanReverse) 53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int get_msb(unsigned int n) { 55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned long first_set_bit; 56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian _BitScanReverse(&first_set_bit, n); 57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return first_set_bit; 58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#undef USE_MSC_INTRIN 60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#else 61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Returns (int)floor(log2(n)). n must be > 0. 62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int get_msb(unsigned int n) { 63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int log = 0; 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian unsigned int value = n; 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int i; 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (i = 4; i >= 0; --i) { 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int shift = (1 << i); 69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const unsigned int x = value >> shift; 70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (x != 0) { 71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian value = x; 72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian log += shift; 73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return log; 76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif // VP9_COMMON_VP9_SYSTEMDEPENDENT_H_ 84