X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fx86%2Fcommon_x86_asm.S;h=765e324b20e69ea5781833723a4a2417c7c3a638;hb=9e9d28007a44c664c79cd89549988194e156a39f;hp=675711e44aab140ae21a8ae9271c900be7d1b343;hpb=fc2427e81b1c648550d0368652d6a475df785027;p=mesa.git diff --git a/src/mesa/x86/common_x86_asm.S b/src/mesa/x86/common_x86_asm.S index 675711e44aa..765e324b20e 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.2 2000/10/23 00:16:28 gareth Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.5 * - * Copyright (C) 1999-2000 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,121 +30,190 @@ * Written by Holger Waechtler * * Cleaned up and simplified by Gareth Hughes + * + */ + +/* + * NOTE: Avoid using spaces in between '(' ')' and arguments, especially + * with macros like CONST, LLBL that expand to CONCAT(...). Putting spaces + * in there will break the build on some platforms. */ #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): + _CET_ENDBR + /* 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) -/* AMD vendor string - */ -#define AUTH 0x68747541 /* "Auth" */ -#define ENTI 0x69746e65 /* "enti" */ -#define CAMD 0x444d4163 /* "cAMD" */ + /* Verify the ID Flag bit has been written. */ + CMP_L (ECX, EAX) + SETNE (AL) + XOR_L (CONST(0xff), EAX) + RET - SEG_DATA -/* We might want to print out some useful messages. - */ -LLBL( found_intel ): STRING( "Genuine Intel processor found\n\0" ) -LLBL( found_amd ): STRING( "Authentic AMD processor found\n\0" ) +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid) +HIDDEN(_mesa_x86_cpuid) +GLNAME(_mesa_x86_cpuid): + _CET_ENDBR + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EDI) + PUSH_L (EBX) + CPUID - SEG_TEXT + 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 ALIGNTEXT4 -GLOBL GLNAME( gl_identify_x86_cpu_features ) -GLNAME( gl_identify_x86_cpu_features ): +GLOBL GLNAME(_mesa_x86_cpuid_eax) +HIDDEN(_mesa_x86_cpuid_eax) +GLNAME(_mesa_x86_cpuid_eax): + _CET_ENDBR + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) - PUSH_L ( EBX ) + CPUID - /* 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 ) + POP_L (EBX) + RET - /* Verify the ID Flag bit has been written. - */ - CMP_L ( ECX, EAX ) - JZ ( LLBL ( cpuid_done ) ) +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_ebx) +HIDDEN(_mesa_x86_cpuid_ebx) +GLNAME(_mesa_x86_cpuid_ebx): + _CET_ENDBR + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) - /* Get the CPU vendor info. - */ - XOR_L ( EAX, EAX ) CPUID + MOV_L (EBX, EAX) /* return EBX */ - /* 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_ecx) +HIDDEN(_mesa_x86_cpuid_ecx) +GLNAME(_mesa_x86_cpuid_ecx): + _CET_ENDBR + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (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 (ECX, EAX) /* return ECX */ + + POP_L (EBX) + RET + +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_edx) +HIDDEN(_mesa_x86_cpuid_edx) +GLNAME(_mesa_x86_cpuid_edx): + _CET_ENDBR + 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 ) ) + MOV_L (EDX, EAX) /* return EDX */ -LLBL( cpuid_other ): + 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 ): + _CET_ENDBR + XORPS ( XMM0, XMM0 ) + + RET - /* Test for other processors here when required. - */ -LLBL( cpuid_failed ): +/* Perform an SSE divide-by-zero to see if the operating system + * correctly supports unmasked SIMD FPU exceptions. Signal handlers for + * SIGILL and SIGFPE should have been set before calling this function, + * otherwise this could kill the client application. + */ +ALIGNTEXT4 +GLOBL GLNAME( _mesa_test_os_sse_exception_support ) +HIDDEN(_mesa_test_os_sse_exception_support) +GLNAME( _mesa_test_os_sse_exception_support ): + _CET_ENDBR + PUSH_L ( EBP ) + MOV_L ( ESP, EBP ) + SUB_L ( CONST( 8 ), ESP ) + + /* Save the original MXCSR register value. + */ + STMXCSR ( REGOFF( -4, EBP ) ) - /* If we can't determine the feature information, we must - * return zero to indicate that no platform-specific - * optimizations can be used. + /* Unmask the divide-by-zero exception and perform one. */ - MOV_L ( CONST(0), EAX ) + STMXCSR ( REGOFF( -8, EBP ) ) + AND_L ( CONST( 0xfffffdff ), REGOFF( -8, EBP ) ) + LDMXCSR ( REGOFF( -8, EBP ) ) -LLBL ( cpuid_done ): + XORPS ( XMM0, XMM0 ) - POP_L ( EBX ) + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + + MOVUPS ( REGIND( ESP ), XMM1 ) + + DIVPS ( XMM0, XMM1 ) + + /* Restore the original MXCSR register value. + */ + LDMXCSR ( REGOFF( -4, EBP ) ) + + LEAVE RET + +#endif + + +#if defined (__ELF__) && defined (__linux__) + .section .note.GNU-stack,"",%progbits +#endif