• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 rr_CPUID_hpp
16 #define rr_CPUID_hpp
17 
18 namespace rr
19 {
20 	#if !defined(__i386__) && defined(_M_IX86)
21 		#define __i386__ 1
22 	#endif
23 
24 	#if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64))
25 		#define __x86_64__ 1
26 	#endif
27 
28 	class CPUID
29 	{
30 	public:
31 		static bool supportsMMX();
32 		static bool supportsCMOV();
33 		static bool supportsMMX2();   // MMX instructions added by SSE: pshufw, pmulhuw, pmovmskb, pavgw/b, pextrw, pinsrw, pmaxsw/ub, etc.
34 		static bool supportsSSE();
35 		static bool supportsSSE2();
36 		static bool supportsSSE3();
37 		static bool supportsSSSE3();
38 		static bool supportsSSE4_1();
39 
40 		static void setEnableMMX(bool enable);
41 		static void setEnableCMOV(bool enable);
42 		static void setEnableSSE(bool enable);
43 		static void setEnableSSE2(bool enable);
44 		static void setEnableSSE3(bool enable);
45 		static void setEnableSSSE3(bool enable);
46 		static void setEnableSSE4_1(bool enable);
47 
48 	private:
49 		static bool MMX;
50 		static bool CMOV;
51 		static bool SSE;
52 		static bool SSE2;
53 		static bool SSE3;
54 		static bool SSSE3;
55 		static bool SSE4_1;
56 
57 		static bool enableMMX;
58 		static bool enableCMOV;
59 		static bool enableSSE;
60 		static bool enableSSE2;
61 		static bool enableSSE3;
62 		static bool enableSSSE3;
63 		static bool enableSSE4_1;
64 
65 		static bool detectMMX();
66 		static bool detectCMOV();
67 		static bool detectSSE();
68 		static bool detectSSE2();
69 		static bool detectSSE3();
70 		static bool detectSSSE3();
71 		static bool detectSSE4_1();
72 	};
73 }
74 
75 namespace rr
76 {
supportsMMX()77 	inline bool CPUID::supportsMMX()
78 	{
79 		return MMX && enableMMX;
80 	}
81 
supportsCMOV()82 	inline bool CPUID::supportsCMOV()
83 	{
84 		return CMOV && enableCMOV;
85 	}
86 
supportsMMX2()87 	inline bool CPUID::supportsMMX2()
88 	{
89 		return supportsSSE();   // Coincides with 64-bit integer vector instructions supported by SSE
90 	}
91 
supportsSSE()92 	inline bool CPUID::supportsSSE()
93 	{
94 		return SSE && enableSSE;
95 	}
96 
supportsSSE2()97 	inline bool CPUID::supportsSSE2()
98 	{
99 		return SSE2 && enableSSE2;
100 	}
101 
supportsSSE3()102 	inline bool CPUID::supportsSSE3()
103 	{
104 		return SSE3 && enableSSE3;
105 	}
106 
supportsSSSE3()107 	inline bool CPUID::supportsSSSE3()
108 	{
109 		return SSSE3 && enableSSSE3;
110 	}
111 
supportsSSE4_1()112 	inline bool CPUID::supportsSSE4_1()
113 	{
114 		return SSE4_1 && enableSSE4_1;
115 	}
116 }
117 
118 #endif   // rr_CPUID_hpp
119