{-# LANGUAGE CApiFFI #-} module Hwcap where import Foreign.C.Types #if defined(riscv64_HOST_ARCH) import Data.Char (ord) import Data.Bits (bit) #endif #include foreign import capi unsafe "sys/auxv.h getauxval" getauxval :: CULong -> CULong {-# NOINLINE hwcap #-} hwcap :: CULong hwcap = getauxval #{const AT_HWCAP} hwcap2 :: CULong #if defined(AT_HWCAP2) hwcap2 = getauxval #{const AT_HWCAP2} {-# NOINLINE hwcap2 #-} #else hwcap2 = 0 #endif #if defined(aarch64_HOST_ARCH) hwcap_FP :: CULong hwcap_FP = #{const HWCAP_FP} hwcap_ASIMD :: CULong hwcap_ASIMD = #{const HWCAP_ASIMD} hwcap_EVTSTRM :: CULong hwcap_EVTSTRM = #{const HWCAP_EVTSTRM} hwcap_AES :: CULong hwcap_AES = #{const HWCAP_AES} hwcap_PMULL :: CULong hwcap_PMULL = #{const HWCAP_PMULL} hwcap_SHA1 :: CULong hwcap_SHA1 = #{const HWCAP_SHA1} hwcap_SHA2 :: CULong hwcap_SHA2 = #{const HWCAP_SHA2} hwcap_CRC32 :: CULong hwcap_CRC32 = #{const HWCAP_CRC32} hwcap_ATOMICS :: CULong hwcap_ATOMICS = #{const HWCAP_ATOMICS} hwcap_FPHP :: CULong hwcap_FPHP = #{const HWCAP_FPHP} hwcap_ASIMDHP :: CULong hwcap_ASIMDHP = #{const HWCAP_ASIMDHP} hwcap_CPUID :: CULong hwcap_CPUID = #{const HWCAP_CPUID} hwcap_ASIMDRDM :: CULong hwcap_ASIMDRDM = #{const HWCAP_ASIMDRDM} hwcap_JSCVT :: CULong hwcap_JSCVT = #{const HWCAP_JSCVT} hwcap_FCMA :: CULong hwcap_FCMA = #{const HWCAP_FCMA} hwcap_LRCPC :: CULong hwcap_LRCPC = #{const HWCAP_LRCPC} hwcap_DCPOP :: CULong hwcap_DCPOP = #{const HWCAP_DCPOP} hwcap_SHA3 :: CULong hwcap_SHA3 = #{const HWCAP_SHA3} hwcap_SM3 :: CULong hwcap_SM3 = #{const HWCAP_SM3} hwcap_SM4 :: CULong hwcap_SM4 = #{const HWCAP_SM4} hwcap_ASIMDDP :: CULong hwcap_ASIMDDP = #{const HWCAP_ASIMDDP} hwcap_SHA512 :: CULong hwcap_SHA512 = #{const HWCAP_SHA512} hwcap_SVE :: CULong hwcap_SVE = #{const HWCAP_SVE} hwcap_ASIMDFHM :: CULong hwcap_ASIMDFHM = #{const HWCAP_ASIMDFHM} hwcap_DIT :: CULong hwcap_DIT = #{const HWCAP_DIT} hwcap_USCAT :: CULong hwcap_USCAT = #{const HWCAP_USCAT} hwcap_ILRCPC :: CULong hwcap_ILRCPC = #{const HWCAP_ILRCPC} hwcap_FLAGM :: CULong hwcap_FLAGM = #{const HWCAP_FLAGM} hwcap_SSBS :: CULong hwcap_SSBS = #{const HWCAP_SSBS} hwcap_SB :: CULong hwcap_SB = #{const HWCAP_SB} hwcap_PACA :: CULong hwcap_PACA = #{const HWCAP_PACA} hwcap_PACG :: CULong hwcap_PACG = #{const HWCAP_PACG} hwcap2_DCPODP :: CULong hwcap2_DCPODP = #{const HWCAP2_DCPODP} hwcap2_SVE2 :: CULong hwcap2_SVE2 = #{const HWCAP2_SVE2} hwcap2_SVEAES :: CULong hwcap2_SVEAES = #{const HWCAP2_SVEAES} hwcap2_SVEPMULL :: CULong hwcap2_SVEPMULL = #{const HWCAP2_SVEPMULL} hwcap2_SVEBITPERM :: CULong hwcap2_SVEBITPERM = #{const HWCAP2_SVEBITPERM} hwcap2_SVESHA3 :: CULong hwcap2_SVESHA3 = #{const HWCAP2_SVESHA3} hwcap2_SVESM4 :: CULong hwcap2_SVESM4 = #{const HWCAP2_SVESM4} hwcap2_FLAGM2 :: CULong hwcap2_FLAGM2 = #{const HWCAP2_FLAGM2} hwcap2_FRINT :: CULong hwcap2_FRINT = #{const HWCAP2_FRINT} hwcap2_SVEI8MM :: CULong hwcap2_SVEI8MM = #{const HWCAP2_SVEI8MM} hwcap2_SVEF32MM :: CULong hwcap2_SVEF32MM = #{const HWCAP2_SVEF32MM} hwcap2_SVEF64MM :: CULong hwcap2_SVEF64MM = #{const HWCAP2_SVEF64MM} hwcap2_SVEBF16 :: CULong hwcap2_SVEBF16 = #{const HWCAP2_SVEBF16} hwcap2_I8MM :: CULong hwcap2_I8MM = #{const HWCAP2_I8MM} hwcap2_BF16 :: CULong hwcap2_BF16 = #{const HWCAP2_BF16} hwcap2_DGH :: CULong hwcap2_DGH = #{const HWCAP2_DGH} hwcap2_RNG :: CULong hwcap2_RNG = #{const HWCAP2_RNG} hwcap2_BTI :: CULong hwcap2_BTI = #{const HWCAP2_BTI} hwcap2_MTE :: CULong hwcap2_MTE = #{const HWCAP2_MTE} hwcap2_AFP :: CULong hwcap2_AFP = #{const HWCAP2_AFP} hwcap2_RPRES :: CULong hwcap2_RPRES = #{const HWCAP2_RPRES} hwcap2_SME :: CULong hwcap2_SME = #{const HWCAP2_SME} hwcap2_SME_F64F64 :: CULong hwcap2_SME_F64F64 = #{const HWCAP2_SME_F64F64} hwcap2_SME_I16I64 :: CULong hwcap2_SME_I16I64 = #{const HWCAP2_SME_I16I64} hwcap2_SME2 :: CULong hwcap2_SME2 = #{const HWCAP2_SME2} hwcap2_WFXT :: CULong hwcap2_WFXT = #{const HWCAP2_WFXT} #elif defined(riscv64_HOST_ARCH) hwcap_I :: CULong hwcap_I = bit (ord 'I' - ord 'A') hwcap_M :: CULong hwcap_M = bit (ord 'M' - ord 'A') hwcap_A :: CULong hwcap_A = bit (ord 'A' - ord 'A') hwcap_F :: CULong hwcap_F = bit (ord 'F' - ord 'A') hwcap_D :: CULong hwcap_D = bit (ord 'D' - ord 'A') hwcap_C :: CULong hwcap_C = bit (ord 'C' - ord 'A') hwcap_V :: CULong hwcap_V = bit (ord 'V' - ord 'A') #endif