blob: 407af16015b4365ec7737ae8e8fdfe33ee24a502 [file] [log] [blame]
Nicolas Capens68a82382018-10-02 13:16:55 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef sw_CPUID_hpp
16#define sw_CPUID_hpp
17
Nicolas Capens157ba262019-12-10 17:49:14 -050018namespace sw {
19
20#if !defined(__i386__) && defined(_M_IX86)
Ben Clayton595d9112019-12-17 20:37:57 +000021# define __i386__ 1
Nicolas Capens157ba262019-12-10 17:49:14 -050022#endif
23
Ben Clayton595d9112019-12-17 20:37:57 +000024#if !defined(__x86_64__) && (defined(_M_AMD64) || defined(_M_X64))
25# define __x86_64__ 1
Nicolas Capens157ba262019-12-10 17:49:14 -050026#endif
27
28class CPUID
Nicolas Capens68a82382018-10-02 13:16:55 -040029{
Nicolas Capens157ba262019-12-10 17:49:14 -050030public:
31 static bool supportsMMX();
32 static bool supportsCMOV();
Ben Clayton595d9112019-12-17 20:37:57 +000033 static bool supportsMMX2(); // MMX instructions added by SSE: pshufw, pmulhuw, pmovmskb, pavgw/b, pextrw, pinsrw, pmaxsw/ub, etc.
Nicolas Capens157ba262019-12-10 17:49:14 -050034 static bool supportsSSE();
35 static bool supportsSSE2();
36 static bool supportsSSE3();
37 static bool supportsSSSE3();
38 static bool supportsSSE4_1();
39 static int coreCount();
40 static int processAffinity();
Nicolas Capens68a82382018-10-02 13:16:55 -040041
Nicolas Capens157ba262019-12-10 17:49:14 -050042 static void setEnableMMX(bool enable);
43 static void setEnableCMOV(bool enable);
44 static void setEnableSSE(bool enable);
45 static void setEnableSSE2(bool enable);
46 static void setEnableSSE3(bool enable);
47 static void setEnableSSSE3(bool enable);
48 static void setEnableSSE4_1(bool enable);
Nicolas Capens68a82382018-10-02 13:16:55 -040049
Ben Clayton595d9112019-12-17 20:37:57 +000050 static void setFlushToZero(bool enable); // Denormal results are written as zero
51 static void setDenormalsAreZero(bool enable); // Denormal inputs are read as zero
Nicolas Capens68a82382018-10-02 13:16:55 -040052
Nicolas Capens157ba262019-12-10 17:49:14 -050053private:
54 static bool MMX;
55 static bool CMOV;
56 static bool SSE;
57 static bool SSE2;
58 static bool SSE3;
59 static bool SSSE3;
60 static bool SSE4_1;
61 static int cores;
62 static int affinity;
Nicolas Capens68a82382018-10-02 13:16:55 -040063
Nicolas Capens157ba262019-12-10 17:49:14 -050064 static bool enableMMX;
65 static bool enableCMOV;
66 static bool enableSSE;
67 static bool enableSSE2;
68 static bool enableSSE3;
69 static bool enableSSSE3;
70 static bool enableSSE4_1;
Nicolas Capens68a82382018-10-02 13:16:55 -040071
Nicolas Capens157ba262019-12-10 17:49:14 -050072 static bool detectMMX();
73 static bool detectCMOV();
74 static bool detectSSE();
75 static bool detectSSE2();
76 static bool detectSSE3();
77 static bool detectSSSE3();
78 static bool detectSSE4_1();
79 static int detectCoreCount();
80 static int detectAffinity();
81};
Nicolas Capens68a82382018-10-02 13:16:55 -040082
Nicolas Capens157ba262019-12-10 17:49:14 -050083} // namespace sw
Nicolas Capens68a82382018-10-02 13:16:55 -040084
Nicolas Capens157ba262019-12-10 17:49:14 -050085/* Inline implementation */
86
87namespace sw {
88
89inline bool CPUID::supportsMMX()
90{
91 return MMX && enableMMX;
Nicolas Capens68a82382018-10-02 13:16:55 -040092}
93
Nicolas Capens157ba262019-12-10 17:49:14 -050094inline bool CPUID::supportsCMOV()
Nicolas Capens68a82382018-10-02 13:16:55 -040095{
Nicolas Capens157ba262019-12-10 17:49:14 -050096 return CMOV && enableCMOV;
Nicolas Capens68a82382018-10-02 13:16:55 -040097}
98
Nicolas Capens157ba262019-12-10 17:49:14 -050099inline bool CPUID::supportsMMX2()
100{
Ben Clayton595d9112019-12-17 20:37:57 +0000101 return supportsSSE(); // Coincides with 64-bit integer vector instructions supported by SSE
Nicolas Capens157ba262019-12-10 17:49:14 -0500102}
103
104inline bool CPUID::supportsSSE()
105{
106 return SSE && enableSSE;
107}
108
109inline bool CPUID::supportsSSE2()
110{
111 return SSE2 && enableSSE2;
112}
113
114inline bool CPUID::supportsSSE3()
115{
116 return SSE3 && enableSSE3;
117}
118
119inline bool CPUID::supportsSSSE3()
120{
121 return SSSE3 && enableSSSE3;
122}
123
124inline bool CPUID::supportsSSE4_1()
125{
126 return SSE4_1 && enableSSE4_1;
127}
128
129inline int CPUID::coreCount()
130{
131 return cores;
132}
133
134inline int CPUID::processAffinity()
135{
136 return affinity;
137}
138
139} // namespace sw
140
Ben Clayton595d9112019-12-17 20:37:57 +0000141#endif // sw_CPUID_hpp