blob: cd194ca3b2947312c377e932912c3b370e797be7 [file] [log] [blame]
Johanncad0eca2015-05-07 16:41:33 -07001/*
Yaowu Xu9c01aa12016-09-01 14:32:49 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Johanncad0eca2015-05-07 16:41:33 -07003 *
Yaowu Xu9c01aa12016-09-01 14:32:49 -07004 * 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.
Johanncad0eca2015-05-07 16:41:33 -070010 */
11
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AOM_PORTS_MSVC_H_
13#define AOM_PORTS_MSVC_H_
Johanncad0eca2015-05-07 16:41:33 -070014#ifdef _MSC_VER
15
Yaowu Xuf883b422016-08-30 14:01:10 -070016#include "./aom_config.h"
Johanncad0eca2015-05-07 16:41:33 -070017
clang-format05ce8502016-08-10 18:23:43 -070018#if _MSC_VER < 1900 // VS2015 provides snprintf
19#define snprintf _snprintf
20#endif // _MSC_VER < 1900
Johanncad0eca2015-05-07 16:41:33 -070021
Alex Conversef2e44aa2015-08-07 18:27:48 -070022#if _MSC_VER < 1800 // VS2013 provides round
James Zernd65ea852015-08-08 11:11:23 -070023#include <math.h>
Alex Conversef2e44aa2015-08-07 18:27:48 -070024static INLINE double round(double x) {
25 if (x < 0)
26 return ceil(x - 0.5);
27 else
28 return floor(x + 0.5);
29}
Alex Conversed1327ae2016-04-07 15:16:30 -070030
31static INLINE float roundf(float x) {
32 if (x < 0)
33 return (float)ceil(x - 0.5f);
34 else
35 return (float)floor(x + 0.5f);
36}
37
38static INLINE long lroundf(float x) {
39 if (x < 0)
40 return (long)(x - 0.5f);
41 else
42 return (long)(x + 0.5f);
43}
Alex Conversef2e44aa2015-08-07 18:27:48 -070044#endif // _MSC_VER < 1800
45
Yi Luo4c3c0f22017-10-12 09:08:43 -070046#if HAVE_AVX
47#include <immintrin.h>
48// Note:
49// _mm256_insert_epi16 intrinsics is available from vs2017.
50// We define this macro for vs2015 and earlier. The
51// intrinsics used here are in vs2015 document:
52// https://msdn.microsoft.com/en-us/library/hh977022.aspx
53// Input parameters:
54// a: __m256i,
55// d: int16_t,
56// indx: imm8 (0 - 15)
57#if _MSC_VER <= 1900
58#define _mm256_insert_epi16(a, d, indx) \
59 _mm256_insertf128_si256( \
60 a, \
61 _mm_insert_epi16(_mm256_extractf128_si256(a, indx >> 3), d, indx % 8), \
62 indx >> 3)
Yaowu Xu7ba35f62018-01-15 14:14:36 -080063
64static INLINE int _mm256_extract_epi32(__m256i a, const int i) {
65 return a.m256i_i32[i & 7];
66}
67static INLINE __m256i _mm256_insert_epi32(__m256i a, int b, const int i) {
68 __m256i c = a;
69 c.m256i_i32[i & 7] = b;
70 return c;
71}
Yi Luo4c3c0f22017-10-12 09:08:43 -070072#endif // _MSC_VER <= 1900
73#endif // HAVE_AVX
Johanncad0eca2015-05-07 16:41:33 -070074#endif // _MSC_VER
Yaowu Xuf883b422016-08-30 14:01:10 -070075#endif // AOM_PORTS_MSVC_H_