1 /* Determine CPU support for SIMD on Power PC 2 * Copyright 2004 Phil Karn, KA9Q 3 */ 4 #include <stdio.h> 5 #include "fec.h" 6 #ifdef __VEC__ 7 #include <sys/sysctl.h> 8 #endif 9 10 /* Various SIMD instruction set names */ 11 char *Cpu_modes[] = {"Unknown","Portable C","x86 Multi Media Extensions (MMX)", 12 "x86 Streaming SIMD Extensions (SSE)", 13 "x86 Streaming SIMD Extensions 2 (SSE2)", 14 "PowerPC G4/G5 Altivec/Velocity Engine"}; 15 16 enum cpu_mode Cpu_mode; 17 18 void find_cpu_mode(void){ 19 20 if(Cpu_mode != UNKNOWN) 21 return; 22 23 #ifdef __VEC__ 24 { 25 /* Ask the OS if we have Altivec support */ 26 int selectors[2] = { CTL_HW, HW_VECTORUNIT }; 27 int hasVectorUnit = 0; 28 size_t length = sizeof(hasVectorUnit); 29 int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); 30 if(0 == error && hasVectorUnit) 31 Cpu_mode = ALTIVEC; 32 else 33 Cpu_mode = PORT; 34 } 35 #else 36 Cpu_mode = PORT; 37 #endif 38 39 fprintf(stderr,"SIMD CPU detect: %s\n",Cpu_modes[Cpu_mode]); 40 } 41