packages feed

cpu-features-0.1.0.0: src/Hwcap.hsc

{-# LANGUAGE CApiFFI #-}
module Hwcap where
import Foreign.C.Types
#if defined(riscv64_HOST_ARCH)
import Data.Char (ord)
import Data.Bits (bit)
#endif

#include <sys/auxv.h>

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