EMCAL/DCAL Trigger Mapping for Run 2
[u/mrichter/AliRoot.git] / Vc / src / support.cpp
1 /*  This file is part of the Vc library.
2
3     Copyright (C) 2010-2012 Matthias Kretz <kretz@kde.org>
4
5     Vc is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Lesser General Public License as
7     published by the Free Software Foundation, either version 3 of
8     the License, or (at your option) any later version.
9
10     Vc is distributed in the hope that it will be useful, but
11     WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Lesser General Public License for more details.
14
15     You should have received a copy of the GNU Lesser General Public
16     License along with Vc.  If not, see <http://www.gnu.org/licenses/>.
17
18 */
19
20 #include <Vc/global.h>
21 #include <Vc/cpuid.h>
22 #include <Vc/support.h>
23
24 #ifdef VC_MSVC
25 #include <intrin.h>
26 #endif
27
28 #if defined(VC_GCC) && VC_GCC >= 0x40400
29 #define VC_TARGET_NO_SIMD __attribute__((target("no-sse2,no-avx")))
30 #else
31 #define VC_TARGET_NO_SIMD
32 #endif
33
34 namespace AliRoot {
35 namespace Vc
36 {
37
38 VC_TARGET_NO_SIMD
39 static inline bool xgetbvCheck(unsigned int bits)
40 {
41 #if defined(VC_MSVC) && VC_MSVC >= 160040219 // MSVC 2010 SP1 introduced _xgetbv
42     unsigned long long xcrFeatureMask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
43     return (xcrFeatureMask & bits) == bits;
44 #elif defined(VC_GNU_ASM) && !defined(VC_NO_XGETBV)
45     unsigned int eax;
46     asm("xgetbv" : "=a"(eax) : "c"(0) : "edx");
47     return (eax & bits) == bits;
48 #else
49     // can't check, but if OSXSAVE is true let's assume it'll work
50     return bits > 0; // ignore 'warning: unused parameter'
51 #endif
52 }
53
54 VC_TARGET_NO_SIMD
55 bool isImplementationSupported(Implementation impl)
56 {
57     CpuId::init();
58
59     switch (impl) {
60     case ScalarImpl:
61         return true;
62     case SSE2Impl:
63         return CpuId::hasSse2();
64     case SSE3Impl:
65         return CpuId::hasSse3();
66     case SSSE3Impl:
67         return CpuId::hasSsse3();
68     case SSE41Impl:
69         return CpuId::hasSse41();
70     case SSE42Impl:
71         return CpuId::hasSse42();
72     case AVXImpl:
73         return CpuId::hasOsxsave() && CpuId::hasAvx() && xgetbvCheck(0x6);
74     case AVX2Impl:
75         return false;
76     case ImplementationMask:
77         return false;
78     }
79     return false;
80 }
81
82 VC_TARGET_NO_SIMD
83 Vc::Implementation bestImplementationSupported()
84 {
85     CpuId::init();
86
87     if (!CpuId::hasSse2 ()) return Vc::ScalarImpl;
88     if (!CpuId::hasSse3 ()) return Vc::SSE2Impl;
89     if (!CpuId::hasSsse3()) return Vc::SSE3Impl;
90     if (!CpuId::hasSse41()) return Vc::SSSE3Impl;
91     if (!CpuId::hasSse42()) return Vc::SSE41Impl;
92     if (CpuId::hasAvx() && CpuId::hasOsxsave() && xgetbvCheck(0x6)) {
93         return Vc::AVXImpl;
94     }
95     return Vc::SSE42Impl;
96 }
97
98 VC_TARGET_NO_SIMD
99 unsigned int extraInstructionsSupported()
100 {
101     unsigned int flags = 0;
102     if (CpuId::hasF16c()) flags |= Vc::Float16cInstructions;
103     if (CpuId::hasFma4()) flags |= Vc::Fma4Instructions;
104     if (CpuId::hasXop ()) flags |= Vc::XopInstructions;
105     if (CpuId::hasPopcnt()) flags |= Vc::PopcntInstructions;
106     if (CpuId::hasSse4a()) flags |= Vc::Sse4aInstructions;
107     if (CpuId::hasFma ()) flags |= Vc::FmaInstructions;
108     //if (CpuId::hasPclmulqdq()) flags |= Vc::PclmulqdqInstructions;
109     //if (CpuId::hasAes()) flags |= Vc::AesInstructions;
110     //if (CpuId::hasRdrand()) flags |= Vc::RdrandInstructions;
111     return flags;
112 }
113
114 } // namespace Vc
115 } // namespace AliRoot
116
117 #undef VC_TARGET_NO_SIMD
118
119 // vim: sw=4 sts=4 et tw=100