X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fx86%2Fcommon_x86_asm.S;h=1887bcaaff4d1d6815c2c8e6f97596a0d5638366;hb=951bf44a56d3236550d4d910741c10d5e0d1311b;hp=f877fd57c2885c0902ff03200721428af4f1ae26;hpb=35883ceb9389f9e5b4be8233f2326367c6aecddb;p=mesa.git diff --git a/src/mesa/x86/common_x86_asm.S b/src/mesa/x86/common_x86_asm.S index f877fd57c28..1887bcaaff4 100644 --- a/src/mesa/x86/common_x86_asm.S +++ b/src/mesa/x86/common_x86_asm.S @@ -1,10 +1,7 @@ -/* $Id: common_x86_asm.S,v 1.10 2002/06/11 01:26:58 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 4.0.3 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -19,9 +16,10 @@ * 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 NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL 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. + * THE AUTHORS OR COPYRIGHT HOLDERS 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. */ /* @@ -32,6 +30,7 @@ * Written by Holger Waechtler * * Cleaned up and simplified by Gareth Hughes + * */ /* @@ -41,131 +40,129 @@ */ #include "matypes.h" +#include "assyntax.h" #include "common_x86_features.h" + SEG_TEXT -/* Intel vendor string - */ -#define GENU 0x756e6547 /* "Genu" */ -#define INEI 0x49656e69 /* "ineI" */ -#define NTEL 0x6c65746e /* "ntel" */ +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_has_cpuid) +HIDDEN(_mesa_x86_has_cpuid) +GLNAME(_mesa_x86_has_cpuid): -/* AMD vendor string - */ -#define AUTH 0x68747541 /* "Auth" */ -#define ENTI 0x69746e65 /* "enti" */ -#define CAMD 0x444d4163 /* "cAMD" */ + /* Test for the CPUID command. If the ID Flag bit in EFLAGS + * (bit 21) is writable, the CPUID command is present */ + PUSHF_L + POP_L (EAX) + MOV_L (EAX, ECX) + XOR_L (CONST(0x00200000), EAX) + PUSH_L (EAX) + POPF_L + PUSHF_L + POP_L (EAX) + /* Verify the ID Flag bit has been written. */ + CMP_L (ECX, EAX) + SETNE (AL) + XOR_L (CONST(0xff), EAX) - SEG_DATA + RET -/* We might want to print out some useful messages. - */ -GLNAME( found_intel ): STRING( "Genuine Intel processor found\n\0" ) -GLNAME( found_amd ): STRING( "Authentic AMD processor found\n\0" ) +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid) +HIDDEN(_mesa_x86_cpuid) +GLNAME(_mesa_x86_cpuid): - SEG_TEXT + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EDI) + PUSH_L (EBX) -ALIGNTEXT4 -GLOBL GLNAME( _mesa_identify_x86_cpu_features ) -GLNAME( _mesa_identify_x86_cpu_features ): + CPUID - PUSH_L ( EBX ) + MOV_L (REGOFF(16, ESP), EDI) /* *eax */ + MOV_L (EAX, REGIND(EDI)) + MOV_L (REGOFF(20, ESP), EDI) /* *ebx */ + MOV_L (EBX, REGIND(EDI)) + MOV_L (REGOFF(24, ESP), EDI) /* *ecx */ + MOV_L (ECX, REGIND(EDI)) + MOV_L (REGOFF(28, ESP), EDI) /* *edx */ + MOV_L (EDX, REGIND(EDI)) + + POP_L (EBX) + POP_L (EDI) + RET - /* Test for the CPUID command. If the ID Flag bit in EFLAGS - * (bit 21) is writable, the CPUID command is present. - */ - PUSHF_L - POP_L ( EAX ) - MOV_L ( EAX, ECX ) - XOR_L ( CONST(0x00200000), EAX ) - PUSH_L ( EAX ) - POPF_L - PUSHF_L - POP_L ( EAX ) +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_eax) +HIDDEN(_mesa_x86_cpuid_eax) +GLNAME(_mesa_x86_cpuid_eax): - /* Verify the ID Flag bit has been written. - */ - CMP_L ( ECX, EAX ) - JZ ( LLBL (cpuid_done) ) + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) - /* Get the CPU vendor info. - */ - XOR_L ( EAX, EAX ) CPUID - /* Test for Intel processors. We must look for the - * "GenuineIntel" string in EBX, ECX and EDX. - */ - CMP_L ( CONST(GENU), EBX ) - JNE ( LLBL(cpuid_amd) ) - CMP_L ( CONST(INEI), EDX ) - JNE ( LLBL(cpuid_amd) ) - CMP_L ( CONST(NTEL), ECX ) - JNE ( LLBL(cpuid_amd) ) - - /* We have an Intel processor, so we can get the feature - * information with an CPUID input value of 1. - */ - MOV_L ( CONST(0x1), EAX ) - CPUID - MOV_L ( EDX, EAX ) - JMP ( LLBL(cpuid_done) ) + POP_L (EBX) + RET -LLBL(cpuid_amd): +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_ebx) +HIDDEN(_mesa_x86_cpuid_ebx) +GLNAME(_mesa_x86_cpuid_ebx): - /* Test for AMD processors. We must look for the - * "AuthenticAMD" string in EBX, ECX and EDX. - */ - CMP_L ( CONST(AUTH), EBX ) - JNE ( LLBL(cpuid_other) ) - CMP_L ( CONST(ENTI), EDX ) - JNE ( LLBL(cpuid_other) ) - CMP_L ( CONST(CAMD), ECX ) - JNE ( LLBL(cpuid_other) ) - - /* We have an AMD processor, so we can get the feature - * information after we verify that the extended functions are - * supported. - */ - MOV_L ( CONST(0x80000000), EAX ) - CPUID - TEST_L ( EAX, EAX ) - JZ ( LLBL (cpuid_failed) ) + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) - MOV_L ( CONST(0x80000001), EAX ) CPUID - MOV_L ( EDX, EAX ) - JMP ( LLBL (cpuid_done) ) - -LLBL(cpuid_other): + MOV_L (EBX, EAX) /* return EBX */ - /* Test for other processors here when required. - */ + POP_L (EBX) + RET -LLBL(cpuid_failed): +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_ecx) +HIDDEN(_mesa_x86_cpuid_ecx) +GLNAME(_mesa_x86_cpuid_ecx): - /* If we can't determine the feature information, we must - * return zero to indicate that no platform-specific - * optimizations can be used. - */ - MOV_L ( CONST(0), EAX ) + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) -LLBL (cpuid_done): + CPUID + MOV_L (ECX, EAX) /* return ECX */ - POP_L ( EBX ) + POP_L (EBX) RET +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_edx) +HIDDEN(_mesa_x86_cpuid_edx) +GLNAME(_mesa_x86_cpuid_edx): + + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) + + CPUID + MOV_L (EDX, EAX) /* return EDX */ + + POP_L (EBX) + RET #ifdef USE_SSE_ASM /* Execute an SSE instruction to see if the operating system correctly * supports SSE. A signal handler for SIGILL should have been set * before calling this function, otherwise this could kill the client * application. + * + * -----> !!!! ATTENTION DEVELOPERS !!!! <----- + * + * If you're debugging with gdb and you get stopped in this function, + * just type 'continue'! Execution will proceed normally. + * See freedesktop.org bug #1709 for more info. */ ALIGNTEXT4 GLOBL GLNAME( _mesa_test_os_sse_support ) +HIDDEN(_mesa_test_os_sse_support) GLNAME( _mesa_test_os_sse_support ): XORPS ( XMM0, XMM0 ) @@ -180,6 +177,7 @@ GLNAME( _mesa_test_os_sse_support ): */ ALIGNTEXT4 GLOBL GLNAME( _mesa_test_os_sse_exception_support ) +HIDDEN(_mesa_test_os_sse_exception_support) GLNAME( _mesa_test_os_sse_exception_support ): PUSH_L ( EBP ) @@ -205,8 +203,6 @@ GLNAME( _mesa_test_os_sse_exception_support ): MOVUPS ( REGIND( ESP ), XMM1 ) - ADD_L ( CONST( 32 ), ESP ) - DIVPS ( XMM0, XMM1 ) /* Restore the original MXCSR register value. @@ -217,3 +213,8 @@ GLNAME( _mesa_test_os_sse_exception_support ): RET #endif + + +#if defined (__ELF__) && defined (__linux__) + .section .note.GNU-stack,"",%progbits +#endif