| Project: /youtube/cobalt/_project.yaml |
| Book: /youtube/cobalt/_book.yaml |
| |
| # Starboard Module Reference: `cpu_features.h` |
| |
| ## Structs |
| |
| ### SbCPUFeatures |
| |
| #### Members |
| |
| * `SbCPUFeaturesArchitecture architecture` |
| |
| Architecture of the processor. |
| * `const char * brand` |
| |
| Processor brand string retrievable by CPUID or from /proc/cpuinfo under the |
| key "model name" or "Processor". |
| * `int32_t icache_line_size` |
| |
| Processor cache line size in bytes of Level 1 instruction cache and data |
| cache. Queried by sysconf(_SC_LEVEL1_ICACHE_LINESIZE) and |
| sysconf(_SC_LEVEL1_DCACHE_LINESIZE), or from files /proc/cpuinfo, |
| /proc/self/auxv, or CPUID with CLFLUSH instruction. |
| * `int32_t dcache_line_size` |
| * `bool has_fpu` |
| |
| Processor has floating-point unit on-chip. |
| * `uint32_t hwcap` |
| |
| Bit-mask containing processor features flags. Queried by getauxval(AT_HWCAP) |
| if it is supported. |
| * `uint32_t hwcap2` |
| |
| Similar to hwcap. Queried by getauxval(AT_HWCAP2) if it is supported. |
| * `SbCPUFeaturesARM arm` |
| |
| Processor features specific to each architecture. Set the appropriate |
| `SbCPUFeatures<ARCH_NAME>` for the underlying architecture. Set the other |
| `SbCPUFeatures<OTHER_ARCH>` to be invalid, meaning: |
| |
| * '-1' for signed integer fields |
| |
| * 'false' for feature flag fields |
| |
| * '0' for feature flag bitmasks |
| |
| * empty string for string fields |
| |
| * `SbCPUFeaturesMIPS mips_arch` |
| |
| The reason that the "_arch" suffix exists for mips is because on some |
| platforms that use MIPS as the underlying architecture, "mips" is already |
| defined as a macro. |
| * `SbCPUFeaturesX86 x86` |
| |
| ### SbCPUFeaturesARM |
| |
| #### Members |
| |
| * `int16_t implementer` |
| |
| Processor implementer/implementor code. ARM is 0x41, NVIDIA is 0x4e, etc. |
| * `int16_t variant` |
| |
| Processor variant number, indicating the major revision number. |
| * `int16_t revision` |
| |
| Processor revision number, indicating the minor revision number. |
| * `int16_t architecture_generation` |
| |
| Processor architecture generation number, indicating the generations |
| (ARMv6-M, ARMv7, etc) within an architecture family. This field is called |
| "Architecture" or "Constant" in the processor ID register. |
| * `int16_t part` |
| |
| Processor part number, indicating Cortex-M0, Cortex-A8, etc. |
| * `bool has_neon` |
| |
| ARM Advanced SIMD (NEON) vector instruction set extension. |
| * `bool has_thumb2` |
| |
| Thumb-2 mode. |
| * `bool has_vfp` |
| |
| VFP (SIMD vector floating point instructions). |
| * `bool has_vfp3` |
| |
| VFP version 3 |
| * `bool has_vfp4` |
| |
| VFP version 4 |
| * `bool has_vfp3_d32` |
| |
| VFP version 3 with 32 D-registers. |
| * `bool has_idiva` |
| |
| SDIV and UDIV hardware division in ARM mode. |
| * `bool has_aes` |
| |
| ###### Arm 64 feature flags |
| |
| AES instructions. |
| * `bool has_crc32` |
| |
| CRC32 instructions. |
| * `bool has_sha1` |
| |
| SHA-1 instructions. |
| * `bool has_sha2` |
| |
| SHA-256 instructions. |
| * `bool has_pmull` |
| |
| 64-bit PMULL and PMULL2 instructions. |
| |
| ### SbCPUFeaturesMIPS |
| |
| #### Members |
| |
| * `bool has_msa` |
| |
| MIPS SIMD Architecture (MSA). |
| |
| ### SbCPUFeaturesX86 |
| |
| #### Members |
| |
| * `const char * vendor` |
| |
| Processor vendor ID string, e.g. "GenuineIntel", "AuthenticAMD", etc |
| * `int16_t family` |
| |
| Processor family ID |
| * `int16_t ext_family` |
| |
| Processor extended family ID, needs to be examined only when the family ID |
| is 0FH. |
| * `int16_t model` |
| |
| Processor model ID |
| * `int16_t ext_model` |
| |
| Processor extended model ID, needs to be examined only when the family ID is |
| 06H or 0FH. |
| * `int16_t stepping` |
| |
| Processor stepping ID, a product revision number |
| * `int16_t type` |
| |
| Processor type ID |
| * `int32_t signature` |
| |
| A raw form of collection of processor stepping, model, and family |
| information |
| * `bool has_cmov` |
| |
| Conditional Move Instructions (plus FCMOVcc, FCOMI with FPU). |
| * `bool has_mmx` |
| |
| Multimedia extensions. |
| * `bool has_sse` |
| |
| SSE (Streaming SIMD Extensions). |
| * `bool has_sse2` |
| |
| SSE2 extensions. |
| * `bool has_tsc` |
| |
| Time Stamp Counter. |
| * `bool has_sse3` |
| |
| SSE3 extensions. |
| * `bool has_pclmulqdq` |
| |
| PCLMULQDQ instruction. |
| * `bool has_ssse3` |
| |
| Supplemental SSE3 extensions. |
| * `bool has_sse41` |
| |
| SSE-4.1 extensions. |
| * `bool has_sse42` |
| |
| SSE-4.2 extensions. |
| * `bool has_movbe` |
| |
| MOVBE instruction. |
| * `bool has_popcnt` |
| |
| POPCNT instruction. |
| * `bool has_osxsave` |
| |
| XSAVE/XRSTOR/XGETBV/XSETBV instruction enabled in this OS. |
| * `bool has_avx` |
| |
| AVX (Advanced Vector Extensions). |
| * `bool has_f16c` |
| |
| 16-bit FP conversions. |
| * `bool has_fma3` |
| |
| Fused multiply-add. |
| * `bool has_aesni` |
| |
| AES new instructions (AES-NI). |
| * `bool has_avx2` |
| |
| AVX2 Extensions. |
| * `bool has_avx512f` |
| |
| AVX-512 Foundation. |
| * `bool has_avx512dq` |
| |
| AVX-512 DQ (Double/Quad granular) Instructions. |
| * `bool has_avx512ifma` |
| |
| AVX-512 Integer Fused Multiply-Add instructions. |
| * `bool has_avx512pf` |
| |
| AVX-512 Prefetch. |
| * `bool has_avx512er` |
| |
| AVX-512 Exponential and Reciprocal. |
| * `bool has_avx512cd` |
| |
| AVX-512 Conflict Detection. |
| * `bool has_avx512bw` |
| |
| AVX-512 BW (Byte/Word granular) Instructions. |
| * `bool has_avx512vl` |
| |
| AVX-512 VL (128/256 Vector Length) Extensions. |
| * `bool has_bmi1` |
| |
| First group of bit manipulation extensions. |
| * `bool has_bmi2` |
| |
| Second group of bit manipulation extensions. |
| * `bool has_lzcnt` |
| |
| Bit manipulation instruction LZCNT. |
| * `bool has_sahf` |
| |
| SAHF in long mode. |
| |
| ## Functions |
| |
| ### SbCPUFeaturesGet |
| |
| Retrieve the underlying CPU features and place it in `features`, which must not |
| be NULL. |
| |
| If this function returns false, it means the CPU architecture is unknown and all |
| fields in `features` are invalid. |
| |
| #### Declaration |
| |
| ``` |
| bool SbCPUFeaturesGet(SbCPUFeatures *features) |
| ``` |