{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{- |
Description: Arm features as type-level booleans

This module provides the type-level interface to detect CPU features.
You can mark your function with @\<FEATURE NAME\> ~ True =>@ to indicate that
it requires a specific CPU feature.
You can detect the availability and get the constraint @\<FEATURE NAME\> ~ True@
by pattern-matching on the variable @s\<FEATURE NAME\>@.

Example:

> -- This function requires FEAT_PMULL
> someFunction :: FEAT_PMULL ~ True => ...
>
> case sFEAT_PMULL of
>   STrue -> {- In this branch, FEAT_PMULL is True -} someFunction
>   SFalse -> {- In this branch, FEAT_PMULL is False -} error "FEAT_PMULL not available"
-}
module System.CPUFeatures.Arm.TypeBool
  (FEAT_AES, sFEAT_AES
  ,FEAT_AFP, sFEAT_AFP
  ,FEAT_BF16, sFEAT_BF16
  ,FEAT_BTI, sFEAT_BTI
  ,FEAT_CSV2, sFEAT_CSV2
  ,FEAT_CSV3, sFEAT_CSV3
  ,FEAT_DIT, sFEAT_DIT
  ,FEAT_DotProd, sFEAT_DotProd
  ,FEAT_DPB, sFEAT_DPB
  ,FEAT_DPB2, sFEAT_DPB2
  ,FEAT_ECV, sFEAT_ECV
  ,FEAT_FCMA, sFEAT_FCMA
  ,FEAT_FHM, sFEAT_FHM
  ,FEAT_FlagM, sFEAT_FlagM
  ,FEAT_FlagM2, sFEAT_FlagM2
  ,FEAT_FP16, sFEAT_FP16
  ,FEAT_FPAC, sFEAT_FPAC
  ,FEAT_FRINTTS, sFEAT_FRINTTS
  ,FEAT_I8MM, sFEAT_I8MM
  ,FEAT_JSCVT, sFEAT_JSCVT
  ,FEAT_LRCPC, sFEAT_LRCPC
  ,FEAT_LRCPC2, sFEAT_LRCPC2
  ,FEAT_LSE, sFEAT_LSE
  ,FEAT_LSE2, sFEAT_LSE2
  ,FEAT_PAuth, sFEAT_PAuth
  ,FEAT_PAuth2, sFEAT_PAuth2
  ,FEAT_PMULL, sFEAT_PMULL
  ,FEAT_RDM, sFEAT_RDM
  ,FEAT_RPRES, sFEAT_RPRES
  ,FEAT_SB, sFEAT_SB
  ,FEAT_SHA1, sFEAT_SHA1
  ,FEAT_SHA256, sFEAT_SHA256
  ,FEAT_SHA3, sFEAT_SHA3
  ,FEAT_SHA512, sFEAT_SHA512
  ,FEAT_SME, sFEAT_SME
  ,FEAT_SME_F64F64, sFEAT_SME_F64F64
  ,FEAT_SME_I16I64, sFEAT_SME_I16I64
  ,FEAT_SME2, sFEAT_SME2
  ,FEAT_SPECRES, sFEAT_SPECRES
  ,FEAT_SSBS, sFEAT_SSBS
  ,FEAT_SVE, sFEAT_SVE
  ,FEAT_SVE2, sFEAT_SVE2
  ,FEAT_WFxT, sFEAT_WFxT
  ,SBool(..)
  ) where
import System.CPUFeatures.Arm.Bool
import System.CPUFeatures.Util

type family FEAT_AES :: Bool -- optional from Armv8.0
type family FEAT_AFP :: Bool
type family FEAT_BF16 :: Bool -- optional from Armv8.2, mandatory from Armv8.6
type family FEAT_BTI :: Bool -- optional from Armv8.4, mandatory from Armv8.5
type family FEAT_CSV2 :: Bool -- optional from Armv8.0, mandatory from Armv8.5
type family FEAT_CSV3 :: Bool -- optional from Armv8.0, mandatory from Armv8.5
type family FEAT_DIT :: Bool -- optional from Armv8.3, mandatory from Armv8.4
type family FEAT_DotProd :: Bool -- optional from Armv8.1
type family FEAT_DPB :: Bool -- optional from Armv8.1, mandatory from Armv8.2
type family FEAT_DPB2 :: Bool -- optional from Armv8.1, mandatory from Armv8.5
type family FEAT_ECV :: Bool -- optional from Armv8.5, mandatory from Armv8.6
type family FEAT_FCMA :: Bool -- optional from Armv8.2
type family FEAT_FHM :: Bool -- optional from Armv8.1
type family FEAT_FlagM :: Bool -- optional from Armv8.1, mandatory from Armv8.4
type family FEAT_FlagM2 :: Bool -- optional from Armv8.4
type family FEAT_FP16 :: Bool -- optional from Armv8.2
type family FEAT_FPAC :: Bool -- optional from Armv8.2
type family FEAT_FRINTTS :: Bool -- optional from Armv8.4
type family FEAT_I8MM :: Bool -- optional from Armv8.1, mandatory from Armv8.6
type family FEAT_JSCVT :: Bool -- optional from Armv8.2
type family FEAT_LRCPC :: Bool -- optional from Armv8.2, mandatory from Armv8.3
type family FEAT_LRCPC2 :: Bool -- optional from Armv8.2, mandatory from Armv8.4
type family FEAT_LSE :: Bool -- optional from Armv8.0, mandatory from Armv8.1
type family FEAT_LSE2 :: Bool -- optional from Armv8.2, mandatory from Armv8.4
type family FEAT_PAuth :: Bool -- optional from Armv8.2, mandatory from Armv8.3
type family FEAT_PAuth2 :: Bool -- optional from Armv8.2, mandatory from Armv8.6
type family FEAT_PMULL :: Bool -- optional from Armv8.0
type family FEAT_RDM :: Bool -- optional from Armv8.0
type family FEAT_RPRES :: Bool -- optional from Armv8.0
type family FEAT_SB :: Bool -- optional from Armv8.0, mandatory from Armv8.5
type family FEAT_SHA1 :: Bool -- optional from Armv8.0
type family FEAT_SHA256 :: Bool -- optional from Armv8.0
type family FEAT_SHA3 :: Bool -- optional from Armv8.1
type family FEAT_SHA512 :: Bool -- optional from Armv8.1
type family FEAT_SME :: Bool
type family FEAT_SME_F64F64 :: Bool
type family FEAT_SME_I16I64 :: Bool
type family FEAT_SME2 :: Bool
type family FEAT_SPECRES :: Bool -- optional from Armv8.0, mandatory from Armv8.5
type family FEAT_SSBS :: Bool -- optional from Armv8.0
type family FEAT_SVE :: Bool -- optional from Armv8.2
type family FEAT_SVE2 :: Bool -- optional from Armv9.0
type family FEAT_WFxT :: Bool

sFEAT_AES :: SBool FEAT_AES
sFEAT_AFP :: SBool FEAT_AFP
sFEAT_BF16 :: SBool FEAT_BF16
sFEAT_BTI :: SBool FEAT_BTI
sFEAT_CSV2 :: SBool FEAT_CSV2
sFEAT_CSV3 :: SBool FEAT_CSV3
sFEAT_DIT :: SBool FEAT_DIT
sFEAT_DotProd :: SBool FEAT_DotProd
sFEAT_DPB :: SBool FEAT_DPB
sFEAT_DPB2 :: SBool FEAT_DPB2
sFEAT_ECV :: SBool FEAT_ECV
sFEAT_FCMA :: SBool FEAT_FCMA
sFEAT_FHM :: SBool FEAT_FHM
sFEAT_FlagM :: SBool FEAT_FlagM
sFEAT_FlagM2 :: SBool FEAT_FlagM2
sFEAT_FP16 :: SBool FEAT_FP16
sFEAT_FPAC :: SBool FEAT_FPAC
sFEAT_FRINTTS :: SBool FEAT_FRINTTS
sFEAT_I8MM :: SBool FEAT_I8MM
sFEAT_JSCVT :: SBool FEAT_JSCVT
sFEAT_LRCPC :: SBool FEAT_LRCPC
sFEAT_LRCPC2 :: SBool FEAT_LRCPC2
sFEAT_LSE :: SBool FEAT_LSE
sFEAT_LSE2 :: SBool FEAT_LSE2
sFEAT_PAuth :: SBool FEAT_PAuth
sFEAT_PAuth2 :: SBool FEAT_PAuth2
sFEAT_PMULL :: SBool FEAT_PMULL
sFEAT_RDM :: SBool FEAT_RDM
sFEAT_RPRES :: SBool FEAT_RPRES
sFEAT_SB :: SBool FEAT_SB
sFEAT_SHA1 :: SBool FEAT_SHA1
sFEAT_SHA256 :: SBool FEAT_SHA256
sFEAT_SHA3 :: SBool FEAT_SHA3
sFEAT_SHA512 :: SBool FEAT_SHA512
sFEAT_SME :: SBool FEAT_SME
sFEAT_SME_F64F64 :: SBool FEAT_SME_F64F64
sFEAT_SME_I16I64 :: SBool FEAT_SME_I16I64
sFEAT_SME2 :: SBool FEAT_SME2
sFEAT_SPECRES :: SBool FEAT_SPECRES
sFEAT_SSBS :: SBool FEAT_SSBS
sFEAT_SVE :: SBool FEAT_SVE
sFEAT_SVE2 :: SBool FEAT_SVE2
sFEAT_WFxT :: SBool FEAT_WFxT

sFEAT_AES :: SBool FEAT_AES
sFEAT_AES = Bool -> SBool FEAT_AES
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_AES
sFEAT_AFP :: SBool FEAT_AFP
sFEAT_AFP = Bool -> SBool FEAT_AFP
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_AFP
sFEAT_BF16 :: SBool FEAT_BF16
sFEAT_BF16 = Bool -> SBool FEAT_BF16
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_BF16
sFEAT_BTI :: SBool FEAT_BTI
sFEAT_BTI = Bool -> SBool FEAT_BTI
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_BTI
sFEAT_CSV2 :: SBool FEAT_CSV2
sFEAT_CSV2 = Bool -> SBool FEAT_CSV2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_CSV2
sFEAT_CSV3 :: SBool FEAT_CSV3
sFEAT_CSV3 = Bool -> SBool FEAT_CSV3
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_CSV3
sFEAT_DIT :: SBool FEAT_DIT
sFEAT_DIT = Bool -> SBool FEAT_DIT
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_DIT
sFEAT_DotProd :: SBool FEAT_DotProd
sFEAT_DotProd = Bool -> SBool FEAT_DotProd
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_DotProd
sFEAT_DPB :: SBool FEAT_DPB
sFEAT_DPB = Bool -> SBool FEAT_DPB
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_DPB
sFEAT_DPB2 :: SBool FEAT_DPB2
sFEAT_DPB2 = Bool -> SBool FEAT_DPB2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_DPB2
sFEAT_ECV :: SBool FEAT_ECV
sFEAT_ECV = Bool -> SBool FEAT_ECV
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_ECV
sFEAT_FCMA :: SBool FEAT_FCMA
sFEAT_FCMA = Bool -> SBool FEAT_FCMA
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FCMA
sFEAT_FHM :: SBool FEAT_FHM
sFEAT_FHM = Bool -> SBool FEAT_FHM
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FHM
sFEAT_FlagM :: SBool FEAT_FlagM
sFEAT_FlagM = Bool -> SBool FEAT_FlagM
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FlagM
sFEAT_FlagM2 :: SBool FEAT_FlagM2
sFEAT_FlagM2 = Bool -> SBool FEAT_FlagM2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FlagM2
sFEAT_FP16 :: SBool FEAT_FP16
sFEAT_FP16 = Bool -> SBool FEAT_FP16
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FP16
sFEAT_FPAC :: SBool FEAT_FPAC
sFEAT_FPAC = Bool -> SBool FEAT_FPAC
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FPAC
sFEAT_FRINTTS :: SBool FEAT_FRINTTS
sFEAT_FRINTTS = Bool -> SBool FEAT_FRINTTS
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_FRINTTS
sFEAT_I8MM :: SBool FEAT_I8MM
sFEAT_I8MM = Bool -> SBool FEAT_I8MM
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_I8MM
sFEAT_JSCVT :: SBool FEAT_JSCVT
sFEAT_JSCVT = Bool -> SBool FEAT_JSCVT
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_JSCVT
sFEAT_LRCPC :: SBool FEAT_LRCPC
sFEAT_LRCPC = Bool -> SBool FEAT_LRCPC
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_LRCPC
sFEAT_LRCPC2 :: SBool FEAT_LRCPC2
sFEAT_LRCPC2 = Bool -> SBool FEAT_LRCPC2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_LRCPC2
sFEAT_LSE :: SBool FEAT_LSE
sFEAT_LSE = Bool -> SBool FEAT_LSE
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_LSE
sFEAT_LSE2 :: SBool FEAT_LSE2
sFEAT_LSE2 = Bool -> SBool FEAT_LSE2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_LSE2
sFEAT_PAuth :: SBool FEAT_PAuth
sFEAT_PAuth = Bool -> SBool FEAT_PAuth
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_PAuth
sFEAT_PAuth2 :: SBool FEAT_PAuth2
sFEAT_PAuth2 = Bool -> SBool FEAT_PAuth2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_PAuth2
sFEAT_PMULL :: SBool FEAT_PMULL
sFEAT_PMULL = Bool -> SBool FEAT_PMULL
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_PMULL
sFEAT_RDM :: SBool FEAT_RDM
sFEAT_RDM = Bool -> SBool FEAT_RDM
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_RDM
sFEAT_RPRES :: SBool FEAT_RPRES
sFEAT_RPRES = Bool -> SBool FEAT_RPRES
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_RPRES
sFEAT_SB :: SBool FEAT_SB
sFEAT_SB = Bool -> SBool FEAT_SB
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SB
sFEAT_SHA1 :: SBool FEAT_SHA1
sFEAT_SHA1 = Bool -> SBool FEAT_SHA1
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SHA1
sFEAT_SHA256 :: SBool FEAT_SHA256
sFEAT_SHA256 = Bool -> SBool FEAT_SHA256
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SHA256
sFEAT_SHA3 :: SBool FEAT_SHA3
sFEAT_SHA3 = Bool -> SBool FEAT_SHA3
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SHA3
sFEAT_SHA512 :: SBool FEAT_SHA512
sFEAT_SHA512 = Bool -> SBool FEAT_SHA512
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SHA512
sFEAT_SME :: SBool FEAT_SME
sFEAT_SME = Bool -> SBool FEAT_SME
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SME
sFEAT_SME_F64F64 :: SBool FEAT_SME_F64F64
sFEAT_SME_F64F64 = Bool -> SBool FEAT_SME_F64F64
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SME_F64F64
sFEAT_SME_I16I64 :: SBool FEAT_SME_I16I64
sFEAT_SME_I16I64 = Bool -> SBool FEAT_SME_I16I64
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SME_I16I64
sFEAT_SME2 :: SBool FEAT_SME2
sFEAT_SME2 = Bool -> SBool FEAT_SME2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SME2
sFEAT_SPECRES :: SBool FEAT_SPECRES
sFEAT_SPECRES = Bool -> SBool FEAT_SPECRES
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SPECRES
sFEAT_SSBS :: SBool FEAT_SSBS
sFEAT_SSBS = Bool -> SBool FEAT_SSBS
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SSBS
sFEAT_SVE :: SBool FEAT_SVE
sFEAT_SVE = Bool -> SBool FEAT_SVE
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SVE
sFEAT_SVE2 :: SBool FEAT_SVE2
sFEAT_SVE2 = Bool -> SBool FEAT_SVE2
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_SVE2
sFEAT_WFxT :: SBool FEAT_WFxT
sFEAT_WFxT = Bool -> SBool FEAT_WFxT
forall (a :: Bool). Bool -> SBool a
unsafeBoolToSBool Bool
bFEAT_WFxT