ports/comms/libfec/files/cpu_mode.c
Diane Bruce a46dd1ab7a Altivec support probably wasn't maintained for years. Fix it to compile
on powerpc64.

Tested also on amd64.

Hardware sponsored by IntegriCloud.

PR:		ports/235560
Submitted by:	Piotr Kubaj <pkubaj@anongoth.pl>
2019-02-06 23:49:11 +00:00

55 lines
1.3 KiB
C

/* Determine CPU support for SIMD
* Copyright 2004 Phil Karn, KA9Q
*/
#include <stdio.h>
#include "fec.h"
#ifdef __VEC__
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
/* Various SIMD instruction set names */
char *Cpu_modes[] = {"Unknown","Portable C","x86 Multi Media Extensions (MMX)",
"x86 Streaming SIMD Extensions (SSE)",
"x86 Streaming SIMD Extensions 2 (SSE2)",
"PowerPC G4/G5 Altivec/Velocity Engine"};
enum cpu_mode Cpu_mode;
void find_cpu_mode(void){
int f;
if(Cpu_mode != UNKNOWN)
return;
else
Cpu_mode = PORT;
#ifdef __i386__
/* Figure out what kind of CPU we have */
f = cpu_features();
if(f & (1<<26)){ /* SSE2 is present */
Cpu_mode = SSE2;
} else if(f & (1<<25)){ /* SSE is present */
Cpu_mode = SSE;
} else if(f & (1<<23)){ /* MMX is present */
Cpu_mode = MMX;
}
#endif
#ifdef __VEC__
{
/* Ask the OS if we have Altivec support */
#ifdef __APPLE__
int selectors[2] = { CTL_HW, HW_VECTORUNIT };
#endif
int hasVectorUnit = 0;
size_t length = sizeof(hasVectorUnit);
#ifdef __APPLE__
int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0);
#elif __FreeBSD__
int error = sysctlbyname("hw.altivec", &hasVectorUnit, &length, NULL, 0);
#endif
if(0 == error && hasVectorUnit)
Cpu_mode = ALTIVEC;
}
#endif
fprintf(stderr,"SIMD CPU detect: %s\n",Cpu_modes[Cpu_mode]);
}