package sysinfo CPU_Feature :: enum u64 { // Bit-Manipulation ISA Extensions v1. Zba = 3, Zbb, Zbs, // CMOs (ratified). Zicboz, // Bit-Manipulation ISA Extensions v1. Zbc, // Scalar Crypto ISA extensions v1. Zbkb, Zbkc, Zbkx, Zknd, Zkne, Zknh, Zksed, Zksh, Zkt, // Cryptography Extensions Volume II v1. Zvbb, Zvbc, Zvkb, Zvkg, Zvkned, Zvknha, Zvknhb, Zvksed, Zvksh, Zvkt, // ISA Manual v1. Zfh, Zfhmin, Zihintntl, // ISA manual (ratified). Zvfh, Zvfhmin, Zfa, Ztso, // Atomic Compare-and-Swap Instructions Manual (ratified). Zacas, Zicond, // ISA manual (ratified). Zihintpause, // Vector Extensions Manual v1. Zve32x, Zve32f, Zve64x, Zve64f, Zve64d, // ISA manual (ratified). Zimop, // Code Size Reduction (ratified). Zca, Zcb, Zcd, Zcf, // ISA manual (ratified). Zcmop, Zawrs, // Base features, don't think this is ever not here. I, // Integer multiplication and division, currently required by Odin. M, // Atomics. A, // Single precision floating point, currently required by Odin. F, // Double precision floating point, currently required by Odin. D, // Compressed instructions. C, // Vector operations. V, // Indicates Misaligned Scalar Loads will not trap the program. Misaligned_Supported, // Indicates Hardware Support for Misaligned Scalar Loads. Misaligned_Fast, } CPU_Features :: distinct bit_set[CPU_Feature; u64] // Looking up CPU features is expensive on RISCV, and `atomic_load_explicit` // is also a barrier, so we're doing this lookup only once, before `main()` @(private) _features: CPU_Features