common_x86.c revision d8aec9b55b0180384e96cddff48fc48751bbc320
1d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul/* $Id: common_x86.c,v 1.6 2000/01/25 17:04:47 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
5d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul * Version:  3.3
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
7d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *  Check CPU capabilities & initialize optimized funtions for this particular
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *   processor.
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *  Written by Holger Waechtler <holger@akaflieg.extern.tu-berlin.de>
336630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann *  Changed by Andre Werthmann <wertmann@cs.uni-potsdam.de> for using the
346630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann *  new Katmai functions
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include <stdlib.h>
382be79c1aa2c168b7ecfb8289ce462ffb1de935ebKeith Whitwell#include <stdio.h>
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "common_x86asm.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgint gl_x86_cpu_features = 0;
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paulstatic void message(const char *msg)
44d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul{
45d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul   if (getenv("MESA_DEBUG"))
46d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul      fprintf(stderr, "%s\n", msg);
47d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul}
48d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid gl_init_all_x86_asm (void)
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef USE_X86_ASM
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   gl_x86_cpu_features = gl_identify_x86_cpu_features ();
54da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell   gl_x86_cpu_features |= GL_CPU_AnyX86;
55da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell
56da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell   if (getenv("MESA_NO_ASM") != 0)
57da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell      gl_x86_cpu_features = 0;
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (gl_x86_cpu_features & GL_CPU_GenuineIntel) {
60d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul      message("GenuineIntel cpu detected.");
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
63da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell   if (gl_x86_cpu_features) {
64d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul      gl_init_x86_asm_transforms ();
65da54ffc852996f94dcf46b0cdc40c5ff12b55496Keith Whitwell   }
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef USE_MMX_ASM
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (gl_x86_cpu_features & GL_CPU_MMX) {
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      char *s = getenv( "MESA_NO_MMX" );
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (s == NULL) {
71d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul         message("MMX cpu detected.");
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      } else {
734f738b4c1010ddf2e1dc404c198137abeef117d4Josh Vanderhoof         gl_x86_cpu_features &= (~GL_CPU_MMX);
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
78d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef USE_3DNOW_ASM
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (gl_x86_cpu_features & GL_CPU_3Dnow) {
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      char *s = getenv( "MESA_NO_3DNOW" );
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (s == NULL) {
83d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul         message("3Dnow cpu detected.");
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gl_init_3dnow_asm_transforms ();
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      } else {
864f738b4c1010ddf2e1dc404c198137abeef117d4Josh Vanderhoof         gl_x86_cpu_features &= (~GL_CPU_3Dnow);
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
916630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann
926630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann#ifdef USE_KATMAI_ASM
936630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann   if (gl_x86_cpu_features & GL_CPU_Katmai) {
946630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann      char *s = getenv( "MESA_NO_KATMAI" );
956630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann      if (s == NULL) {
96d8aec9b55b0180384e96cddff48fc48751bbc320Brian Paul         message("Katmai cpu detected.");
976630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann         gl_init_katmai_asm_transforms ();
986630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann      } else {
996630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann         gl_x86_cpu_features &= (~GL_CPU_Katmai);
1006630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann      }
1016630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann   }
1026630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann#endif
1036630e2be01f41fb3b0fdf815e00a82d8e980f116Andre Werthmann
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
107