X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fx86%2Fcommon_x86_asm.S;h=ef3cc9eb59fca63b8c32d3e0ce925394bf5c44b2;hb=832417f31e81b415894414621500b7aef328652b;hp=80ee4f8d0808122c226a73c55ae66b520094aa12;hpb=ccc8b9239c8ae5c1f5364a5b99ffa3f8b5a731ab;p=mesa.git diff --git a/src/mesa/x86/common_x86_asm.S b/src/mesa/x86/common_x86_asm.S index 80ee4f8d080..ef3cc9eb59f 100644 --- a/src/mesa/x86/common_x86_asm.S +++ b/src/mesa/x86/common_x86_asm.S @@ -1,10 +1,8 @@ -/* $Id: common_x86_asm.S,v 1.4 2001/02/09 23:23:43 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.4 + * Version: 6.3 * - * 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"), @@ -32,141 +30,139 @@ * Written by Holger Waechtler * * Cleaned up and simplified by Gareth Hughes + * */ -/* $XFree86: xc/extras/Mesa/src/X86/common_x86_asm.S,v 1.5 2000/12/12 23:52:37 dawes Exp $ */ -#include "assyntax.h" +/* + * 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 "matypes.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" ) -#ifdef USE_KATMAI_ASM -GLNAME( katmai_test_dummy ): - D_LONG 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 -#endif +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid) +HIDDEN(_mesa_x86_cpuid) +GLNAME(_mesa_x86_cpuid): + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EDI) + PUSH_L (EBX) - SEG_TEXT + CPUID + + 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): - PUSH_L ( EBX ) + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) - /* 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 ) + CPUID - /* Verify the ID Flag bit has been written. - */ - CMP_L ( ECX, EAX ) - JZ ( LLBL ( cpuid_done ) ) + POP_L (EBX) + RET - /* Get the CPU vendor info. - */ - XOR_L ( EAX, EAX ) - CPUID +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_ebx) +HIDDEN(_mesa_x86_cpuid_ebx) +GLNAME(_mesa_x86_cpuid_ebx): + + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (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 ) ) + MOV_L (EBX, EAX) /* return EBX */ -LLBL( cpuid_amd ): + POP_L (EBX) + RET - /* 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 ) ) +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_ecx) +HIDDEN(_mesa_x86_cpuid_ecx) +GLNAME(_mesa_x86_cpuid_ecx): - MOV_L ( CONST(0x80000001), EAX ) - CPUID - MOV_L ( EDX, EAX ) - JMP ( LLBL ( cpuid_done ) ) + MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ + PUSH_L (EBX) -LLBL( cpuid_other ): + CPUID + MOV_L (ECX, EAX) /* return ECX */ - /* Test for other processors here when required. - */ + POP_L (EBX) + RET -LLBL( cpuid_failed ): +ALIGNTEXT4 +GLOBL GLNAME(_mesa_x86_cpuid_edx) +HIDDEN(_mesa_x86_cpuid_edx) +GLNAME(_mesa_x86_cpuid_edx): - /* 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 (EDX, EAX) /* return EDX */ - POP_L ( EBX ) + POP_L (EBX) RET - -#ifdef USE_KATMAI_ASM +#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( gl_test_os_katmai_support ) -GLNAME( gl_test_os_katmai_support ): +GLOBL GLNAME( _mesa_test_os_sse_support ) +HIDDEN(_mesa_test_os_sse_support) +GLNAME( _mesa_test_os_sse_support ): XORPS ( XMM0, XMM0 ) @@ -179,8 +175,9 @@ GLNAME( gl_test_os_katmai_support ): * otherwise this could kill the client application. */ ALIGNTEXT4 -GLOBL GLNAME( gl_test_os_katmai_exception_support ) -GLNAME( gl_test_os_katmai_exception_support ): +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 ) MOV_L ( ESP, EBP ) @@ -197,7 +194,13 @@ GLNAME( gl_test_os_katmai_exception_support ): LDMXCSR ( REGOFF( -8, EBP ) ) XORPS ( XMM0, XMM0 ) - MOVUPS ( GLNAME( katmai_test_dummy ), XMM1 ) + + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + PUSH_L ( CONST( 0x3f800000 ) ) + + MOVUPS ( REGIND( ESP ), XMM1 ) DIVPS ( XMM0, XMM1 ) @@ -209,3 +212,8 @@ GLNAME( gl_test_os_katmai_exception_support ): RET #endif + + +#if defined (__ELF__) && defined (__linux__) + .section .note.GNU-stack,"",%progbits +#endif