00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00025 #ifdef __APPLE__
00026 #include <sys/sysctl.h>
00027 #elif __AMIGAOS4__
00028 #include <exec/exec.h>
00029 #include <interfaces/exec.h>
00030 #include <proto/exec.h>
00031 #endif
00032
00038 int has_altivec(void)
00039 {
00040 #ifdef __AMIGAOS4__
00041 ULONG result = 0;
00042 extern struct ExecIFace *IExec;
00043
00044 IExec->GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE);
00045 if (result == VECTORTYPE_ALTIVEC) return 1;
00046 return 0;
00047 #elif __APPLE__
00048 int sels[2] = {CTL_HW, HW_VECTORUNIT};
00049 int has_vu = 0;
00050 size_t len = sizeof(has_vu);
00051 int err;
00052
00053 err = sysctl(sels, 2, &has_vu, &len, NULL, 0);
00054
00055 if (err == 0) return (has_vu != 0);
00056 return 0;
00057 #elif defined(RUNTIME_CPUDETECT)
00058 int proc_ver;
00059
00060 asm volatile("mfspr %0, 287" : "=r" (proc_ver));
00061 proc_ver >>= 16;
00062 if (proc_ver & 0x8000 ||
00063 proc_ver == 0x000c ||
00064 proc_ver == 0x0039 || proc_ver == 0x003c ||
00065 proc_ver == 0x0044 || proc_ver == 0x0045 ||
00066 proc_ver == 0x0070)
00067 return 1;
00068 return 0;
00069 #else
00070
00071
00072 return 1;
00073 #endif
00074 }
00075