Rev 4358 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * |
||
4 | * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. |
||
5 | * |
||
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
7 | * copy of this software and associated documentation files (the "Software"), |
||
8 | * to deal in the Software without restriction, including without limitation |
||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
10 | * and/or sell copies of the Software, and to permit persons to whom the |
||
11 | * Software is furnished to do so, subject to the following conditions: |
||
12 | * |
||
13 | * The above copyright notice and this permission notice shall be included |
||
14 | * in all copies or substantial portions of the Software. |
||
15 | * |
||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
17 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||
22 | * OTHER DEALINGS IN THE SOFTWARE. |
||
23 | */ |
||
24 | |||
25 | /* |
||
26 | * Check extended CPU capabilities. Now justs returns the raw CPUID |
||
27 | * feature information, allowing the higher level code to interpret the |
||
28 | * results. |
||
29 | * |
||
30 | * Written by Holger Waechtler |
||
31 | * |
||
32 | * Cleaned up and simplified by Gareth Hughes |
||
33 | * |
||
34 | */ |
||
35 | |||
36 | /* |
||
37 | * NOTE: Avoid using spaces in between '(' ')' and arguments, especially |
||
38 | * with macros like CONST, LLBL that expand to CONCAT(...). Putting spaces |
||
39 | * in there will break the build on some platforms. |
||
40 | */ |
||
41 | |||
42 | #include "matypes.h" |
||
43 | #include "assyntax.h" |
||
44 | #include "common_x86_features.h" |
||
45 | |||
46 | SEG_TEXT |
||
47 | |||
48 | ALIGNTEXT4 |
||
4632 | Serge | 49 | GLOBL GLNAME(_mesa_x86_has_cpuid) |
50 | HIDDEN(_mesa_x86_has_cpuid) |
||
51 | GLNAME(_mesa_x86_has_cpuid): |
||
4358 | Serge | 52 | |
53 | /* Test for the CPUID command. If the ID Flag bit in EFLAGS |
||
54 | * (bit 21) is writable, the CPUID command is present */ |
||
55 | PUSHF_L |
||
56 | POP_L (EAX) |
||
57 | MOV_L (EAX, ECX) |
||
58 | XOR_L (CONST(0x00200000), EAX) |
||
59 | PUSH_L (EAX) |
||
60 | POPF_L |
||
61 | PUSHF_L |
||
62 | POP_L (EAX) |
||
63 | |||
64 | /* Verify the ID Flag bit has been written. */ |
||
65 | CMP_L (ECX, EAX) |
||
66 | SETNE (AL) |
||
67 | XOR_L (CONST(0xff), EAX) |
||
68 | |||
69 | RET |
||
70 | |||
71 | |||
72 | ALIGNTEXT4 |
||
4632 | Serge | 73 | GLOBL GLNAME(_mesa_x86_cpuid) |
74 | HIDDEN(_mesa_x86_cpuid) |
||
75 | GLNAME(_mesa_x86_cpuid): |
||
4358 | Serge | 76 | |
77 | MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ |
||
78 | PUSH_L (EDI) |
||
79 | PUSH_L (EBX) |
||
80 | |||
81 | CPUID |
||
82 | |||
83 | MOV_L (REGOFF(16, ESP), EDI) /* *eax */ |
||
84 | MOV_L (EAX, REGIND(EDI)) |
||
85 | MOV_L (REGOFF(20, ESP), EDI) /* *ebx */ |
||
86 | MOV_L (EBX, REGIND(EDI)) |
||
87 | MOV_L (REGOFF(24, ESP), EDI) /* *ecx */ |
||
88 | MOV_L (ECX, REGIND(EDI)) |
||
89 | MOV_L (REGOFF(28, ESP), EDI) /* *edx */ |
||
90 | MOV_L (EDX, REGIND(EDI)) |
||
91 | |||
92 | POP_L (EBX) |
||
93 | POP_L (EDI) |
||
94 | RET |
||
95 | |||
96 | ALIGNTEXT4 |
||
4632 | Serge | 97 | GLOBL GLNAME(_mesa_x86_cpuid_eax) |
98 | HIDDEN(_mesa_x86_cpuid_eax) |
||
99 | GLNAME(_mesa_x86_cpuid_eax): |
||
4358 | Serge | 100 | |
101 | MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ |
||
102 | PUSH_L (EBX) |
||
103 | |||
104 | CPUID |
||
105 | |||
106 | POP_L (EBX) |
||
107 | RET |
||
108 | |||
109 | ALIGNTEXT4 |
||
4632 | Serge | 110 | GLOBL GLNAME(_mesa_x86_cpuid_ebx) |
111 | HIDDEN(_mesa_x86_cpuid_ebx) |
||
112 | GLNAME(_mesa_x86_cpuid_ebx): |
||
4358 | Serge | 113 | |
114 | MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ |
||
115 | PUSH_L (EBX) |
||
116 | |||
117 | CPUID |
||
118 | MOV_L (EBX, EAX) /* return EBX */ |
||
119 | |||
120 | POP_L (EBX) |
||
121 | RET |
||
122 | |||
123 | ALIGNTEXT4 |
||
4632 | Serge | 124 | GLOBL GLNAME(_mesa_x86_cpuid_ecx) |
125 | HIDDEN(_mesa_x86_cpuid_ecx) |
||
126 | GLNAME(_mesa_x86_cpuid_ecx): |
||
4358 | Serge | 127 | |
128 | MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ |
||
129 | PUSH_L (EBX) |
||
130 | |||
131 | CPUID |
||
132 | MOV_L (ECX, EAX) /* return ECX */ |
||
133 | |||
134 | POP_L (EBX) |
||
135 | RET |
||
136 | |||
137 | ALIGNTEXT4 |
||
4632 | Serge | 138 | GLOBL GLNAME(_mesa_x86_cpuid_edx) |
139 | HIDDEN(_mesa_x86_cpuid_edx) |
||
140 | GLNAME(_mesa_x86_cpuid_edx): |
||
4358 | Serge | 141 | |
142 | MOV_L (REGOFF(4, ESP), EAX) /* cpuid op */ |
||
143 | PUSH_L (EBX) |
||
144 | |||
145 | CPUID |
||
146 | MOV_L (EDX, EAX) /* return EDX */ |
||
147 | |||
148 | POP_L (EBX) |
||
149 | RET |
||
150 | |||
151 | #ifdef USE_SSE_ASM |
||
152 | /* Execute an SSE instruction to see if the operating system correctly |
||
153 | * supports SSE. A signal handler for SIGILL should have been set |
||
154 | * before calling this function, otherwise this could kill the client |
||
155 | * application. |
||
156 | * |
||
157 | * -----> !!!! ATTENTION DEVELOPERS !!!! <----- |
||
158 | * |
||
159 | * If you're debugging with gdb and you get stopped in this function, |
||
160 | * just type 'continue'! Execution will proceed normally. |
||
161 | * See freedesktop.org bug #1709 for more info. |
||
162 | */ |
||
163 | ALIGNTEXT4 |
||
4632 | Serge | 164 | GLOBL GLNAME( _mesa_test_os_sse_support ) |
165 | HIDDEN(_mesa_test_os_sse_support) |
||
166 | GLNAME( _mesa_test_os_sse_support ): |
||
4358 | Serge | 167 | |
168 | XORPS ( XMM0, XMM0 ) |
||
169 | |||
170 | RET |
||
171 | |||
172 | |||
173 | /* Perform an SSE divide-by-zero to see if the operating system |
||
174 | * correctly supports unmasked SIMD FPU exceptions. Signal handlers for |
||
175 | * SIGILL and SIGFPE should have been set before calling this function, |
||
176 | * otherwise this could kill the client application. |
||
177 | */ |
||
178 | ALIGNTEXT4 |
||
4632 | Serge | 179 | GLOBL GLNAME( _mesa_test_os_sse_exception_support ) |
180 | HIDDEN(_mesa_test_os_sse_exception_support) |
||
181 | GLNAME( _mesa_test_os_sse_exception_support ): |
||
4358 | Serge | 182 | |
183 | PUSH_L ( EBP ) |
||
184 | MOV_L ( ESP, EBP ) |
||
185 | SUB_L ( CONST( 8 ), ESP ) |
||
186 | |||
187 | /* Save the original MXCSR register value. |
||
188 | */ |
||
189 | STMXCSR ( REGOFF( -4, EBP ) ) |
||
190 | |||
191 | /* Unmask the divide-by-zero exception and perform one. |
||
192 | */ |
||
193 | STMXCSR ( REGOFF( -8, EBP ) ) |
||
194 | AND_L ( CONST( 0xfffffdff ), REGOFF( -8, EBP ) ) |
||
195 | LDMXCSR ( REGOFF( -8, EBP ) ) |
||
196 | |||
197 | XORPS ( XMM0, XMM0 ) |
||
198 | |||
199 | PUSH_L ( CONST( 0x3f800000 ) ) |
||
200 | PUSH_L ( CONST( 0x3f800000 ) ) |
||
201 | PUSH_L ( CONST( 0x3f800000 ) ) |
||
202 | PUSH_L ( CONST( 0x3f800000 ) ) |
||
203 | |||
204 | MOVUPS ( REGIND( ESP ), XMM1 ) |
||
205 | |||
206 | DIVPS ( XMM0, XMM1 ) |
||
207 | |||
208 | /* Restore the original MXCSR register value. |
||
209 | */ |
||
210 | LDMXCSR ( REGOFF( -4, EBP ) ) |
||
211 | |||
212 | LEAVE |
||
213 | RET |
||
214 | |||
215 | #endif |
||
216 | |||
217 | |||
218 | #if defined (__ELF__) && defined (__linux__) |
||
219 | .section .note.GNU-stack,"",%progbits |
||
220 | #endif----- |