mesa: Move ATTRIBUTE_NOINLINE for glsl_to_tgsi_visitor::visit_expression for MSVC
[mesa.git] / src / mesa / x86 / common_x86_asm.S
index 5e7e39febe5cafb27b7d8a81deec6b917d05af20..765e324b20e69ea5781833723a4a2417c7c3a638 100644 (file)
@@ -1,10 +1,7 @@
-/* $Id: common_x86_asm.S,v 1.12 2002/09/19 16:07:32 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"),
  * 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 <holger@akaflieg.extern.tu-berlin.de>
  *
  * Cleaned up and simplified by Gareth Hughes <gareth@valinux.com>
+ *
  */
 
 /*
  * in there will break the build on some platforms.
  */
 
-#include "matypes.h"
+#include "assyntax.h"
 #include "common_x86_features.h"
 
-
-/* Intel vendor string
- */
-#define GENU   0x756e6547      /* "Genu" */
-#define INEI   0x49656e69      /* "ineI" */
-#define NTEL   0x6c65746e      /* "ntel" */
-
-/* AMD vendor string
- */
-#define AUTH   0x68747541      /* "Auth" */
-#define ENTI   0x69746e65      /* "enti" */
-#define CAMD   0x444d4163      /* "cAMD" */
-
-
-       SEG_DATA
-
-/* 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" )
-
-
        SEG_TEXT
 
 ALIGNTEXT4
-GLOBL GLNAME( _mesa_identify_x86_cpu_features )
-GLNAME( _mesa_identify_x86_cpu_features ):
-
-       PUSH_L  ( EBX )
-       PUSH_L  ( ESI )
-
+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.
-        */
+        * (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 )
+       POP_L   (EAX)
+       MOV_L   (EAX, ECX)
+       XOR_L   (CONST(0x00200000), EAX)
+       PUSH_L  (EAX)
        POPF_L
        PUSHF_L
-       POP_L   ( EAX )
+       POP_L   (EAX)
 
-       /* Verify the ID Flag bit has been written.
-        */
-       CMP_L   ( ECX, EAX )
-       JZ      ( LLBL (cpuid_done) )
+       /* Verify the ID Flag bit has been written. */
+       CMP_L   (ECX, EAX)
+       SETNE   (AL)
+       XOR_L   (CONST(0xff), EAX)
 
-       /* Get the CPU vendor info.
-        */
-       XOR_L   ( EAX, EAX )
-       CPUID
+       RET
 
-       /* 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) )
 
-LLBL(cpuid_amd):
+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)
 
-       /* 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.
-        */
-       /* The features we need are almost all in the extended set.  The
-        * exception is SSE enable, which is in the standard set (0x1).
-        */
-       MOV_L   ( CONST(0x1), EAX )
        CPUID
-       TEST_L  ( EAX, EAX )
-       JZ      ( LLBL (cpuid_failed) )
-       MOV_L   ( EDX, ESI )
 
-       MOV_L   ( CONST(0x80000000), EAX )
-       CPUID
-       TEST_L  ( EAX, EAX )
-       JZ      ( LLBL (cpuid_failed) )
+       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(_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)
 
-       MOV_L   ( CONST(0x80000001), EAX )
        CPUID
-       MOV_L   ( EDX, EAX )
-       
-       AND_L   ( CONST(0x02000000), ESI )      /* OR in the SSE bit */
-       OR_L    ( ESI, EAX )
-       
-       JMP     ( LLBL (cpuid_done) )
 
-LLBL(cpuid_other):
+       POP_L   (EBX)
+       RET
 
-       /* Test for other processors here when required.
-        */
+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)
 
-LLBL(cpuid_failed):
+       CPUID
+       MOV_L   (EBX, EAX)                      /* return EBX */
 
-       /* 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 )
+       POP_L   (EBX)
+       RET
 
-LLBL (cpuid_done):
+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)
+
+       CPUID
+       MOV_L   (ECX, EAX)                      /* return ECX */
 
-       POP_L   ( ESI )
-       POP_L   ( EBX )
+       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)
+
+       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 ):
-
+       _CET_ENDBR
        XORPS   ( XMM0, XMM0 )
 
        RET
@@ -195,8 +176,9 @@ 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 ):
-
+       _CET_ENDBR
        PUSH_L  ( EBP )
        MOV_L   ( ESP, EBP )
        SUB_L   ( CONST( 8 ), ESP )
@@ -220,8 +202,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.
@@ -232,3 +212,8 @@ GLNAME( _mesa_test_os_sse_exception_support ):
        RET
 
 #endif
+
+       
+#if defined (__ELF__) && defined (__linux__)
+       .section .note.GNU-stack,"",%progbits
+#endif