// 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 sw_CPUID_hpp
#define sw_CPUID_hpp

namespace sw {

#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 int coreCount();
	static int processAffinity();

	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);

	static void setFlushToZero(bool enable);       // Denormal results are written as zero
	static void setDenormalsAreZero(bool enable);  // Denormal inputs are read as zero

private:
	static bool MMX;
	static bool CMOV;
	static bool SSE;
	static bool SSE2;
	static bool SSE3;
	static bool SSSE3;
	static bool SSE4_1;
	static int cores;
	static int affinity;

	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();
	static int detectCoreCount();
	static int detectAffinity();
};

}  // namespace sw

/* Inline implementation */

namespace sw {

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;
}

inline int CPUID::coreCount()
{
	return cores;
}

inline int CPUID::processAffinity()
{
	return affinity;
}

}  // namespace sw

#endif  // sw_CPUID_hpp
