Scons: refactor cycles kernel code to avoid building the AVX kernel with
[blender.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 /* x86
23  *
24  * Compile a regular, SSE2 and SSE3 kernel. */
25
26 #if defined(i386) || defined(_M_IX86)
27
28 #ifdef WITH_KERNEL_SSE2
29 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
30 #endif
31
32 #ifdef WITH_KERNEL_SSE3
33 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
34 #endif
35
36 #endif
37
38 /* x86-64
39  *
40  * Compile a regular (includes SSE2), SSE3 and SSE 4.1 kernel. */
41
42 #if defined(__x86_64__) || defined(_M_X64)
43
44 /* SSE2 is always available on x86-64 CPUs, so auto enable */
45 #define __KERNEL_SSE2__
46
47 /* no SSE2 kernel on x86-64, part of regular kernel */
48 #ifdef WITH_KERNEL_SSE3
49 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
50 #endif
51
52 #ifdef WITH_KERNEL_SSE41
53 #define WITH_CYCLES_OPTIMIZED_KERNEL_SSE41
54 #endif
55
56 #ifdef WITH_KERNEL_AVX
57 #define WITH_CYCLES_OPTIMIZED_KERNEL_AVX
58 #endif
59
60 /* MSVC 2008, no SSE41 (broken blendv intrinsic) and no AVX support */
61 #if defined(_MSC_VER) && (_MSC_VER < 1700)
62 #undef WITH_CYCLES_OPTIMIZED_KERNEL_SSE41
63 #undef WITH_CYCLES_OPTIMIZED_KERNEL_AVX
64 #endif
65
66 #endif
67
68 /* SSE Experiment
69  *
70  * This is disabled code for an experiment to use SSE types globally for types
71  * such as float3 and float4. Currently this gives an overall slowdown. */
72
73 #if 0
74 #define __KERNEL_SSE__
75 #ifndef __KERNEL_SSE2__
76 #define __KERNEL_SSE2__
77 #endif
78 #ifndef __KERNEL_SSE3__
79 #define __KERNEL_SSE3__
80 #endif
81 #ifndef __KERNEL_SSSE3__
82 #define __KERNEL_SSSE3__
83 #endif
84 #ifndef __KERNEL_SSE4__
85 #define __KERNEL_SSE4__
86 #endif
87 #endif
88
89 /* SSE Intrinsics includes
90  *
91  * We assume __KERNEL_SSEX__ flags to have been defined at this point */
92
93 /* SSE intrinsics headers */
94 #ifndef FREE_WINDOWS64
95
96 #ifdef __KERNEL_SSE2__
97 #include <xmmintrin.h> /* SSE 1 */
98 #include <emmintrin.h> /* SSE 2 */
99 #endif
100
101 #ifdef __KERNEL_SSE3__
102 #include <pmmintrin.h> /* SSE 3 */
103 #endif
104
105 #ifdef __KERNEL_SSSE3__
106 #include <tmmintrin.h> /* SSSE 3 */
107 #endif
108
109 #ifdef __KERNEL_SSE41__
110 #include <smmintrin.h> /* SSE 4.1 */
111 #endif
112
113 #else
114
115 /* MinGW64 has conflicting declarations for these SSE headers in <windows.h>.
116  * Since we can't avoid including <windows.h>, better only include that */
117 #include <windows.h>
118
119 #endif
120
121 #endif
122
123 #endif /* __UTIL_OPTIMIZATION_H__ */
124