Loading...
--- Libc/Libc-262/pthreads/pthread.c
+++ Libc/Libc-262.2.12/pthreads/pthread.c
@@ -38,12 +38,17 @@
#include <sys/syscall.h>
#include <machine/vmparam.h>
#include <mach/vm_statistics.h>
+#define __APPLE_API_PRIVATE
+#include <machine/cpu_capabilities.h>
#include "pthread_internals.h"
/* Per-thread kernel support */
extern void _pthread_set_self(pthread_t);
extern void mig_init(int);
+
+/* Get CPU capabilities from the kernel */
+__private_extern__ void _init_cpu_capabilities(void);
/* Needed to tell the malloc subsystem we're going multithreaded */
extern void set_malloc_singlethreaded(int);
@@ -75,9 +80,6 @@
tries = _spin_tries;
} while(!_spin_lock_try(lock));
}
-
-/* Apparently, bcopy doesn't declare _cpu_has_altivec anymore */
-int _cpu_has_altivec = 0;
extern mach_port_t thread_recycle_port;
@@ -1287,13 +1289,6 @@
* Perform package initialization - called automatically when application starts
*/
-extern int _cpu_capabilities;
-
-#define kHasAltivec 0x01
-#define kCache32 0x04
-#define kUseDcba 0x20
-#define kNoDcba 0x40
-
static int
pthread_init(void)
{
@@ -1308,11 +1303,7 @@
mach_msg_type_number_t count;
int mib[2];
size_t len;
- int hasvectorunit, numcpus;
-
- extern int _bcopy_initialize(void);
- int dynamic_choice;
-
+ int numcpus;
count = HOST_PRIORITY_INFO_COUNT;
info = (host_info_t)&priority_info;
@@ -1323,8 +1314,8 @@
printf("host_info failed (%d); probably need privilege.\n", kr);
else {
default_priority = priority_info.user_priority;
- min_priority = priority_info.minimum_priority;
- max_priority = priority_info.maximum_priority;
+ min_priority = priority_info.minimum_priority;
+ max_priority = priority_info.maximum_priority;
}
attrs = &_pthread_attr_default;
pthread_attr_init(attrs);
@@ -1352,27 +1343,26 @@
else {
if (basic_info.avail_cpus > 1)
_spin_tries = MP_SPIN_TRIES;
- /* This is a crude test */
- if (basic_info.cpu_subtype >= CPU_SUBTYPE_POWERPC_7400)
- _cpu_has_altivec = 1;
- }
- }
+ }
+ }
+
mach_port_deallocate(mach_task_self(), host);
-
- mib[0] = CTL_HW;
- mib[1] = HW_VECTORUNIT;
- len = sizeof(hasvectorunit);
- if (sysctl(mib, 2, &hasvectorunit, &len, NULL, 0) == 0) {
- _cpu_has_altivec = hasvectorunit;
- }
- if (_cpu_has_altivec) { // G4, let bcopy decide whether to use dcba
- _cpu_capabilities = kCache32 + kHasAltivec;
- } else { // G3, no altivec and no dcba
- _cpu_capabilities = kCache32 + kNoDcba;
- }
-
- dynamic_choice = _bcopy_initialize(); // returns 0, kUseDcba, or kNoDcba
- _cpu_capabilities |= dynamic_choice; // remember dynamic choice, if any
+
+ _init_cpu_capabilities(); /* check for vector unit, cache line size etc */
+
+#if defined(__ppc__)
+ /* Use fsqrt instruction in sqrt() if available. */
+ if (_cpu_capabilities & kHasFsqrt) {
+ extern size_t hw_sqrt_len;
+ extern double sqrt( double );
+ extern double hw_sqrt( double );
+ extern void sys_icache_invalidate(void *, size_t);
+
+ memcpy ( (void *)sqrt, (void *)hw_sqrt, hw_sqrt_len );
+ sys_icache_invalidate((void *)sqrt, hw_sqrt_len);
+ }
+#endif
+
mig_init(1); /* enable multi-threaded mig interfaces */
return 0;
}