Skip to main content

luaur_code_gen/functions/
get_cpu_features_a_64.rs

1use crate::enums::features_a_64::FeaturesA64;
2
3pub fn get_cpu_features_a_64() -> u32 {
4    let mut result: u32 = 0;
5
6    #[cfg(target_os = "macos")]
7    {
8        use core::mem;
9        use core::ptr;
10
11        extern "C" {
12            fn sysctlbyname(
13                name: *const core::ffi::c_char,
14                oldp: *mut core::ffi::c_void,
15                oldlenp: *mut usize,
16                newp: *mut core::ffi::c_void,
17                newlen: usize,
18            ) -> core::ffi::c_int;
19        }
20
21        unsafe {
22            let mut jscvt: core::ffi::c_int = 0;
23            let mut jscvt_len = mem::size_of_val(&jscvt);
24            if sysctlbyname(
25                c"hw.optional.arm.FEAT_JSCVT".as_ptr(),
26                &mut jscvt as *mut _ as *mut core::ffi::c_void,
27                &mut jscvt_len,
28                ptr::null_mut(),
29                0,
30            ) == 0
31                && jscvt == 1
32            {
33                result |= FeaturesA64::Feature_JSCVT as u32;
34            }
35
36            let mut adv_simd: core::ffi::c_int = 0;
37            let mut adv_simd_len = mem::size_of_val(&adv_simd);
38            if sysctlbyname(
39                c"hw.optional.arm.AdvSIMD".as_ptr(),
40                &mut adv_simd as *mut _ as *mut core::ffi::c_void,
41                &mut adv_simd_len,
42                ptr::null_mut(),
43                0,
44            ) == 0
45                && adv_simd == 1
46            {
47                result |= FeaturesA64::Feature_AdvSIMD as u32;
48            }
49        }
50    }
51
52    result
53}