Home | History | Annotate | Download | only in fec
      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