/**************************************************************************
*
- * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2008 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
-
-#include "pipe/p_debug.h"
+#include "pipe/p_config.h"
#include "rtasm_cpu.h"
+#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
+
+#include "util/u_debug.h"
+#include "util/u_cpu_detect.h"
+
+DEBUG_GET_ONCE_BOOL_OPTION(nosse, "GALLIUM_NOSSE", FALSE);
-static boolean rtasm_sse_enabled(void)
+static struct util_cpu_caps *get_cpu_caps(void)
{
- static boolean firsttime = 1;
- static boolean enabled;
-
- /* This gets called quite often at the moment:
- */
- if (firsttime) {
- enabled = !debug_get_bool_option("GALLIUM_NOSSE", FALSE);
- firsttime = FALSE;
- }
- return enabled;
+ util_cpu_detect();
+ return &util_cpu_caps;
}
int rtasm_cpu_has_sse(void)
{
- /* FIXME: actually detect this at run-time */
-#if defined(PIPE_ARCH_X86)
- return rtasm_sse_enabled();
-#else
- return 0;
-#endif
+ return !debug_get_option_nosse() && get_cpu_caps()->has_sse;
}
int rtasm_cpu_has_sse2(void)
{
- /* FIXME: actually detect this at run-time */
-#if defined(PIPE_ARCH_X86)
- return rtasm_sse_enabled();
+ return !debug_get_option_nosse() && get_cpu_caps()->has_sse2;
+}
+
+
#else
+
+int rtasm_cpu_has_sse(void)
+{
return 0;
-#endif
}
+
+int rtasm_cpu_has_sse2(void)
+{
+ return 0;
+}
+
+#endif