blob: 00715586dc2decfed00a03c657deb10e31a24a1c [file] [log] [blame]
Bill Yi4e213d52015-06-23 13:53:11 -07001/* 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 */
11char *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
16enum cpu_mode Cpu_mode;
17
18void 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}