1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2012, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // * Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34
35 #ifndef INCLUDED_IMF_COMPILER_SPECIFIC_H
36 #define INCLUDED_IMF_COMPILER_SPECIFIC_H
37
38 #include <ImfNamespace.h>
39 #include <ImfSimd.h>
40 #include <stdlib.h>
41 #include "ImfExport.h"
42
43 OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
44
45
46 static unsigned long systemEndianCheckValue = 0x12345678;
47 static unsigned long* systemEndianCheckPointer = &systemEndianCheckValue;
48
49 // EXR files are little endian - check processor architecture is too
50 // (optimisation currently not supported for big endian machines)
51 static bool GLOBAL_SYSTEM_LITTLE_ENDIAN =
52 (*(unsigned char*)systemEndianCheckPointer == 0x78 ? true : false);
53
54
55 #ifdef IMF_HAVE_SSE2
56
57 #ifdef __GNUC__
58 // Causes issues on certain gcc versions
59 //#define EXR_FORCEINLINE inline __attribute__((always_inline))
60 #define EXR_FORCEINLINE inline
61 #define EXR_RESTRICT __restrict
62
EXRAllocAligned(size_t size,size_t alignment)63 static void* EXRAllocAligned(size_t size, size_t alignment)
64 {
65 void* ptr = 0;
66 posix_memalign(&ptr, alignment, size);
67 return ptr;
68 }
69
70
EXRFreeAligned(void * ptr)71 static void EXRFreeAligned(void* ptr)
72 {
73 free(ptr);
74 }
75
76 #elif defined _MSC_VER
77
78 #define EXR_FORCEINLINE __forceinline
79 #define EXR_RESTRICT __restrict
80
EXRAllocAligned(size_t size,size_t alignment)81 static void* EXRAllocAligned(size_t size, size_t alignment)
82 {
83 return _aligned_malloc(size, alignment);
84 }
85
86
EXRFreeAligned(void * ptr)87 static void EXRFreeAligned(void* ptr)
88 {
89 _aligned_free(ptr);
90 }
91
92 #elif defined (__INTEL_COMPILER) || \
93 defined(__ICL) || \
94 defined(__ICC) || \
95 defined(__ECC)
96
97 #define EXR_FORCEINLINE inline
98 #define EXR_RESTRICT restrict
99
EXRAllocAligned(size_t size,size_t alignment)100 static void* EXRAllocAligned(size_t size, size_t alignment)
101 {
102 return _mm_malloc(size, alignment);
103 }
104
105
EXRFreeAligned(void * ptr)106 static void EXRFreeAligned(void* ptr)
107 {
108 _mm_free(ptr);
109 }
110
111 #else
112
113 // generic compiler
114 #define EXR_FORCEINLINE inline
115 #define EXR_RESTRICT
116
EXRAllocAligned(size_t size,size_t alignment)117 static void* EXRAllocAligned(size_t size, size_t alignment)
118 {
119 return malloc(size);
120 }
121
122
EXRFreeAligned(void * ptr)123 static void EXRFreeAligned(void* ptr)
124 {
125 free(ptr);
126 }
127
128 #endif // compiler switch
129
130
131 #else // IMF_HAVE_SSE2
132
133
134 #define EXR_FORCEINLINE inline
135 #define EXR_RESTRICT
136
EXRAllocAligned(size_t size,size_t alignment)137 static void* EXRAllocAligned(size_t size, size_t alignment)
138 {
139 return malloc(size);
140 }
141
142
EXRFreeAligned(void * ptr)143 static void EXRFreeAligned(void* ptr)
144 {
145 free(ptr);
146 }
147
148
149 #endif // IMF_HAVE_SSE2
150
151 //
152 // Simple CPUID based runtime detection of various capabilities
153 //
154 class IMF_EXPORT CpuId
155 {
156 public:
157 CpuId();
158
159 bool sse2;
160 bool sse3;
161 bool ssse3;
162 bool sse4_1;
163 bool sse4_2;
164 bool avx;
165 bool f16c;
166 };
167
168
169 OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
170
171
172 #endif //include guard
173