16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
10d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#ifndef VP9_COMMON_VP9_SYSTEMDEPENDENT_H_
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define VP9_COMMON_VP9_SYSTEMDEPENDENT_H_
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#ifdef _MSC_VER
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org# include <math.h>  // the ceil() definition must precede intrin.h
1676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org# if _MSC_VER > 1310 && (defined(_M_X64) || defined(_M_IX86))
1776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#  include <intrin.h>
1876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#  define USE_MSC_INTRIN
1976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org# endif
2076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org# define snprintf _snprintf
21dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
2376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#ifdef __cplusplus
2476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgextern "C" {
25d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif
26d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
27d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "./vpx_config.h"
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#if ARCH_X86 || ARCH_X86_64
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvoid vpx_reset_mmx_state(void);
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define vp9_clear_system_state() vpx_reset_mmx_state()
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#else
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define vp9_clear_system_state()
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#endif
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
35ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#if defined(_MSC_VER) && _MSC_VER < 1800
36ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org// round is not defined in MSVC before VS2013.
3776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic INLINE int round(double x) {
38d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org  if (x < 0)
39d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    return (int)ceil(x - 0.5);
40d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org  else
41d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    return (int)floor(x + 0.5);
42d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org}
43d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif
44d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
45dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// use GNU builtins where available.
46dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#if defined(__GNUC__) && \
47dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
48dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgstatic INLINE int get_msb(unsigned int n) {
49dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  return 31 ^ __builtin_clz(n);
50dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}
5176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#elif defined(USE_MSC_INTRIN)
52dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#pragma intrinsic(_BitScanReverse)
53dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
54dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgstatic INLINE int get_msb(unsigned int n) {
55dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  unsigned long first_set_bit;
56dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  _BitScanReverse(&first_set_bit, n);
57dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  return first_set_bit;
58dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}
5976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#undef USE_MSC_INTRIN
60dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#else
61dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// Returns (int)floor(log2(n)). n must be > 0.
62dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgstatic INLINE int get_msb(unsigned int n) {
63dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  int log = 0;
64dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  unsigned int value = n;
65dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  int i;
66dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
67dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  for (i = 4; i >= 0; --i) {
68dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    const int shift = (1 << i);
69dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    const unsigned int x = value >> shift;
70dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    if (x != 0) {
71dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org      value = x;
72dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org      log += shift;
73dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org    }
74dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  }
75dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  return log;
76dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}
77dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
78dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
79dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
80dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
81dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
82dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
83d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif  // VP9_COMMON_VP9_SYSTEMDEPENDENT_H_
84