Man Linux: Main Page and Category List

NAME

       ggGetSwarType - Get CPU features

SYNOPSIS

       #include <ggi/gg.h>

       #if defined GG_HAVE_INT64
       #endif

       #if defined GG_LITTLE_ENDIAN
       #endif

       #if defined GG_BIG_ENDIAN
       #endif

       gg_swartype ggGetSwarType(void);

DESCRIPTION

       The GG_HAVE_INT64 macro is defined on 64-bit architectures where 64-bit
       integer values function as normal integer  values  with  respect  to  C
       operations.  Otherwise it is not defined.

       The  GG_LITTLE_ENDIAN  or GG_BIG_ENDIAN are defined, respectively, when
       the architecture stores values in little or big endian order.   One  of
       the two will be defined, the other undefined, accordingly.

       SWAR stands for SIMD Within A Register.  The most well known example of
       SWAR is Intel MMX technology.

       ggGetSwarType tells  which  specific  SWAR  instruction  sets  the  CPU
       implements.   This  is  useful  to choose at runtime a machine-specific
       implementation of a very calculation-intensive routine.  SWAR detection
       is  done  once during ggInit(3) and the value is cached for future use,
       thus it should be fast enough to choose  implementations  on  the  fly.
       However,  due to this, SMP machines must have identical feature sets in
       all processors in order to ensure accurate  results  (see  the  GG_OPTS
       option description below.)

RETURN VALUE

       ggGetSwarType  returns  an  integer  in which each bit set means that a
       specific SWAR instruction set is available.  The integer value  may  be
       32  bits  long or 64 bits long, depending on whether LibGG was compiled
       for a 32-bit or 64-bit machine, as per the GG_HAVE_INT64 macro.

RECOGNIZED SWARS

       The following flags are defined for all architectures.   All  of  these
       flags  can be OR’ed and are exclusive even between architectures.  Note
       at this stage of development some  of  these  SIMD  sets  are  not  yet
       detected correctly.

       GG_SWAR_NONE
              The CPU can run a vanilla C program. (hopefully! :-)

       GG_SWAR_32BITC
              The CPU can perform 32-bit math fast enough to give an advantage
              over 16-bit math for software SWAR implementations.  Almost  all
              computers will have this capability today.

       GG_SWAR_ALTIVEC
              The CPU has an AltiVec matrix coprocessor (Motorola G4.)

       GG_SWAR_SSE
              The CPU supports Intel Streaming SIMD Extensions.

       GG_SWAR_SSE2
              The CPU supports Intel Streaming SIMD Extensions Version 2.

       GG_SWAR_SSE3
              The CPU supports Intel Streaming SIMD Extensions Version 3.

       GG_SWAR_MMX
              The CPU supports Intel Multimedia Extensions.

       GG_SWAR_MMXPLUS
              The   CPU   supports  Cyrix  enhancements  to  Intel  Multimedia
              Extensions.

       GG_SWAR_3DNOW
              The CPU supports AMD 3DNOW! instructions.

       GG_SWAR_ADV3DNOW
              The CPU supports AMD Advanced 3DNOW! instructions.

       GG_SWAR_MAX
              The CPU supports PA-RISC MAX Instructions.

       GG_SWAR_SIGD
              The CPU supports Microunity Mediaprocessor SIGD instructions.

       Additionally, 64 bits architectures define the following flags:

       GG_SWAR_64BITC
              The CPU can perform 64-bit math fast enough to give an advantage
              over 32-bit and 16-bit math for software SWAR implementations.

       GG_SWAR_MVI
              The CPU supports DEC (Compaq) Alpha Motion Video Instructions.

       GG_SWAR_MAX2
              The CPU supports PA-RISC MAX2 Instructions.

       GG_SWAR_MDMX
              The   CPU   supports   MIPS  Digital  Media  Extension  (MaDMaX)
              Instructions.

       GG_SWAR_MAJC
              The  CPU  supports  SUN  Microprocessor  Architecture  for  Java
              Computing.

       GG_SWAR_VIS
              The CPU supports the SUN Visual Instruction Set

ENVIRONMENT VARIABLE

       If   the  "-banswar=0xhexnumber"  option  is  present  in  the  GG_OPTS
       environment variable when ggInit is  first  called,  bits  set  in  the
       0xhexnumber  field  will  not  be  presented  to the application in the
       return  value  of  ggGetSwarType.   This  feature  can  be   used   for
       performance   benchmarking,   to   disable  the  use  of  certain  SWAR
       implementations.  It may also be used if a multiproccesor machine  mis-
       detects  the usable SWAR instruction set because the processors are not
       identical.

BUGS

       No support is currently implemented for PDP endian machines.

       SWAR detection code is incomplete for many architectures, and  as  such
       LibGG may may fail to detect SWAR in the CPU.