| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //    http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #ifndef rr_CPUID_hpp | 
 | #define rr_CPUID_hpp | 
 |  | 
 | namespace rr { | 
 |  | 
 | #if !defined(__i386__) && defined(_M_IX86) | 
 | #	define __i386__ 1 | 
 | #endif | 
 |  | 
 | #if !defined(__x86_64__) && (defined(_M_AMD64) || defined(_M_X64)) | 
 | #	define __x86_64__ 1 | 
 | #endif | 
 |  | 
 | class CPUID | 
 | { | 
 | public: | 
 | 	static bool supportsMMX(); | 
 | 	static bool supportsCMOV(); | 
 | 	static bool supportsMMX2();  // MMX instructions added by SSE: pshufw, pmulhuw, pmovmskb, pavgw/b, pextrw, pinsrw, pmaxsw/ub, etc. | 
 | 	static bool supportsSSE(); | 
 | 	static bool supportsSSE2(); | 
 | 	static bool supportsSSE3(); | 
 | 	static bool supportsSSSE3(); | 
 | 	static bool supportsSSE4_1(); | 
 |  | 
 | 	static void setEnableMMX(bool enable); | 
 | 	static void setEnableCMOV(bool enable); | 
 | 	static void setEnableSSE(bool enable); | 
 | 	static void setEnableSSE2(bool enable); | 
 | 	static void setEnableSSE3(bool enable); | 
 | 	static void setEnableSSSE3(bool enable); | 
 | 	static void setEnableSSE4_1(bool enable); | 
 |  | 
 | private: | 
 | 	static bool MMX; | 
 | 	static bool CMOV; | 
 | 	static bool SSE; | 
 | 	static bool SSE2; | 
 | 	static bool SSE3; | 
 | 	static bool SSSE3; | 
 | 	static bool SSE4_1; | 
 |  | 
 | 	static bool enableMMX; | 
 | 	static bool enableCMOV; | 
 | 	static bool enableSSE; | 
 | 	static bool enableSSE2; | 
 | 	static bool enableSSE3; | 
 | 	static bool enableSSSE3; | 
 | 	static bool enableSSE4_1; | 
 |  | 
 | 	static bool detectMMX(); | 
 | 	static bool detectCMOV(); | 
 | 	static bool detectSSE(); | 
 | 	static bool detectSSE2(); | 
 | 	static bool detectSSE3(); | 
 | 	static bool detectSSSE3(); | 
 | 	static bool detectSSE4_1(); | 
 | }; | 
 |  | 
 | }  // namespace rr | 
 |  | 
 | /* Inline implementation */ | 
 |  | 
 | namespace rr { | 
 |  | 
 | inline bool CPUID::supportsMMX() | 
 | { | 
 | 	return MMX && enableMMX; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsCMOV() | 
 | { | 
 | 	return CMOV && enableCMOV; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsMMX2() | 
 | { | 
 | 	return supportsSSE();  // Coincides with 64-bit integer vector instructions supported by SSE | 
 | } | 
 |  | 
 | inline bool CPUID::supportsSSE() | 
 | { | 
 | 	return SSE && enableSSE; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsSSE2() | 
 | { | 
 | 	return SSE2 && enableSSE2; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsSSE3() | 
 | { | 
 | 	return SSE3 && enableSSE3; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsSSSE3() | 
 | { | 
 | 	return SSSE3 && enableSSSE3; | 
 | } | 
 |  | 
 | inline bool CPUID::supportsSSE4_1() | 
 | { | 
 | 	return SSE4_1 && enableSSE4_1; | 
 | } | 
 |  | 
 | }  // namespace rr | 
 |  | 
 | #endif  // rr_CPUID_hpp |