ruapu/README.md
2024-02-21 14:28:09 +08:00

81 lines
1.9 KiB
Markdown

# ruapu
Detect cpu ISA features with single-file
<table>
<tr><td>CPU</td><td> &#9989; x86, x86-64<br/>&#9989; arm, aarch64</td><td rowspan=3>
```c
#define RUAPU_IMPLEMENTATION
#include "ruapu.h"
int main()
{
// initialize ruapu once
ruapu_init();
// now, tell me if this cpu has avx2
int has_avx2 = ruapu_supports("avx2");
return 0;
}
```
</td></tr>
<tr><td>OS</td><td>&#9989; Windows<br/>&#9989; Linux<br/>&#9989; macOS<br/>&#9989; Android<br/>&#9989; iOS</td></tr>
<tr><td>Compiler</td><td>&#9989; GCC<br/>&#9989; Clang<br/>&#9989; MSVC<br/>&#9989; MinGW</td></tr>
</table>
## Let's ruapu
<table>
<tr><td>
Compile ruapu test program
```shell
# GCC / MinGW
gcc main.c -o ruapu
```
```shell
# Clang
clang main.c -o ruapu
```
```shell
# MSVC
cl.exe /Fe: ruapu.exe main.c
```
</td>
<td>
Run ruapu in command line
```shell
./ruapu
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 1
xop = 0
... more lines omitted ...
```
</td></tr>
</table>
## Techniques inside ruapu
ruapu is implemented in C language to ensure the widest possible portability.
ruapu determines whether the CPU supports certain instruction sets by trying to execute instructions and detecting whether an `Illegal Instruction` exception occurs. ruapu does not rely on the cpuid instructions and registers related to the CPU architecture, nor does it rely on the `MISA` information and system calls of the operating system. This can help us get more detailed CPU ISA information.
- Detect vendor extended ISA, apple `amx`, risc-v vendor ISA, etc.
- Checking for richer isa on Windows ARM, `IsProcessorFeaturePresent()` can only get little ISA information
- Correctly detect `x86-avx512` for macOS, macOS hides it in `cpuid`
- Detect new cpu's ISA on older systems, they are usually not exposed in `auxv` or `MISA`
- Detect CPU hidden ISA, `x86-fma4` on zen1, ISA in hypervisor, etc.