1fef0bd044e97cf131c971b34e08f4418bd235ed
[blender-staging.git] / intern / cycles / util / util_optimization.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __UTIL_OPTIMIZATION_H__
18 #define __UTIL_OPTIMIZATION_H__
19
20 #ifndef __KERNEL_GPU__
21
22 /* quiet unused define warnings */
23 #if defined(__KERNEL_SSE2__)  || \
24         defined(__KERNEL_SSE3__)  || \
25         defined(__KERNEL_SSSE3__) || \
26         defined(__KERNEL_SSE41__) || \
27         defined(__KERNEL_AVX__)   || \
28         defined(__KERNEL_AVX2__)
29         /* do nothing */
30 #endif
31
32 /* x86
33  *
34  * Compile a regular, SSE2 and SSE3 kernel. */
35
36 #if defined(i386) || defined(_M_IX86)
37
38 #ifdef WITH_KERNEL_SSE2
39 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
40 #endif
41
42 #ifdef WITH_KERNEL_SSE3
43 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
44 #endif
45
46 #endif
47
48 /* x86-64
49  *
50  * Compile a regular (includes SSE2), SSE3, SSE 4.1, AVX and AVX2 kernel. */
51
52 #if defined(__x86_64__) || defined(_M_X64)
53
54 /* SSE2 is always available on x86-64 CPUs, so auto enable */
55 #define __KERNEL_SSE2__
56
57 /* no SSE2 kernel on x86-64, part of regular kernel */
58 #ifdef WITH_KERNEL_SSE3
59 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
60 #endif
61
62 #ifdef WITH_KERNEL_SSE41
63 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE41
64 #endif
65
66 #ifdef WITH_KERNEL_AVX
67 #define WITH_CYCLES_OPTIMIZED_KERNEL_AVX
68 #endif
69
70 #ifdef WITH_KERNEL_AVX2
71 #define WITH_CYCLES_OPTIMIZED_KERNEL_AVX2
72 #endif
73
74 #endif
75
76 /* SSE Experiment
77  *
78  * This is disabled code for an experiment to use SSE types globally for types
79  * such as float3 and float4. Currently this gives an overall slowdown. */
80
81 #if 0
82 #define __KERNEL_SSE__
83 #ifndef __KERNEL_SSE2__
84 #define __KERNEL_SSE2__
85 #endif
86 #ifndef __KERNEL_SSE3__
87 #define __KERNEL_SSE3__
88 #endif
89 #ifndef __KERNEL_SSSE3__
90 #define __KERNEL_SSSE3__
91 #endif
92 #ifndef __KERNEL_SSE4__
93 #define __KERNEL_SSE4__
94 #endif
95 #endif
96
97 /* SSE Intrinsics includes
98  *
99  * We assume __KERNEL_SSEX__ flags to have been defined at this point */
100
101 /* SSE intrinsics headers */
102 #ifndef FREE_WINDOWS64
103
104 #ifdef _MSC_VER
105 #include <intrin.h>
106 #elif (defined(__x86_64__) || defined(__i386__))
107 #include <x86intrin.h>
108 #endif
109
110 #else
111
112 /* MinGW64 has conflicting declarations for these SSE headers in <windows.h>.
113  * Since we can't avoid including <windows.h>, better only include that */
114 #include "util_windows.h"
115
116 #endif
117
118 #endif
119
120 #endif /* __UTIL_OPTIMIZATION_H__ */
121