Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
2.5 KiB

/**
*** Copyright (C) 1985-1998 Intel Corporation.
***
*** The information and source code contained herein is the exclusive property
*** of Intel Corporation and may not be disclosed, examined, or
*** reproduced in whole or in part without explicit written authorization from
*** the Company.
***
*** static char sccs_id[] = "@(#)cpu_disp.c 1.9 06/06/00 14:08:14";
***
**/
#include <sect_attribs.h>
#include <cruntime.h>
#include <internal.h>
#undef leave
#define CPU_HAS_SSE2(x) (((x) & (1 << 26)) != 0)
#ifdef _MSC_VER
int __sse2_available_init(void);
#pragma data_seg(".CRT$XIC")
_CRTALLOC(".CRT$XIC") static _PIFV pinit = __sse2_available_init;
#pragma data_seg()
#endif /* _MSC_VER */
int __sse2_available;
int __use_sse2_mathfcns;
static int
has_osfxsr_set()
{
int ret = 0;
__try {
__asm movapd xmm0, xmm1;
ret = 1;
}
__except(1) {
}
return ret;
}
__declspec(naked) int __sse2_available_init()
{
int cpu_feature;
__asm
{
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
push ebx
push edi
push esi
pushfd /* if we can't write to bit 21 */
pop eax /* of the eflags, then we don't */
mov ecx, eax /* have a cpuid instruction. */
xor eax, 0x200000
push eax
popfd
pushfd
pop edx
sub edx, ecx
je DONE /* CPUID not available */
push ecx /* restore eflags */
popfd
mov eax, 1
cpuid
DONE :
mov cpu_feature, edx
}
__use_sse2_mathfcns = __sse2_available = 0;
if (CPU_HAS_SSE2(cpu_feature)) {
if (has_osfxsr_set()) {
__sse2_available = 1;
#if !defined(_SYSCRT)
/*
* The VC++ CRT will automatically enable the SSE2 implementations
* when possible. The system CRT will not, so existing apps don't
* start seeing different results on a Pentium4.
*/
__use_sse2_mathfcns = 1;
#endif
}
}
__asm
{
xor eax, eax
pop esi
pop edi
pop ebx
leave
ret
}
}
_CRTIMP int __cdecl _set_SSE2_enable(int flag)
{
return __use_sse2_mathfcns = flag ? __sse2_available : 0;
}