
# Copyright (c) 2024, Alexis Engelke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
#   may be used to endorse or promote products derived from this software
#   without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# Features introduced in Armv8.0
[AES]
  armname: FEAT_AES
  llvmname: aes
  availopt: armv8.0a
[CRC32]
  armname: FEAT_CRC32
  llvmname: crc
  availopt: armv8.0a
  avail: armv8.1a
[EL3]
  armname: FEAT_EL3
  llvmname: el3
  availopt: armv8.0a
[PMULL]
  armname: FEAT_PMULL
  llvmname: aes
  availopt: armv8.0a
  requires: AES
[SHA1]
  armname: FEAT_SHA1
  llvmname: sha2
  availopt: armv8.0a
[SHA256]
  armname: FEAT_SHA256
  llvmname: sha2
  availopt: armv8.0a
  requires: SHA1

# Features introduced in Armv8.1
[LOR]
  armname: FEAT_LOR
  llvmname: lor
  availopt: armv8.0a
  avail: armv8.1a
[LSE]
  armname: FEAT_LSE
  llvmname: lse
  availopt: armv8.0a
  avail: armv8.1a
[PAN]
  armname: FEAT_PAN
  llvmname: pan
  availopt: armv8.0a
  avail: armv8.1a
[RDM]
  armname: FEAT_RDM
  llvmname: rdm
  availopt: armv8.0a
  avail: armv8.1a

# Features introduced in Armv8.2
[DPB]
  armname: FEAT_DPB
  llvmname: ccpp
  availopt: armv8.1a
  avail: armv8.2a
[F32MM]
  armname: FEAT_F32MM
  llvmname: f32mm
  availopt: armv8.2a
  requires: SVE
  incomplete: yes
[F64MM]
  armname: FEAT_F64MM
  llvmname: f64mm
  availopt: armv8.2a
  requires: SVE
  incomplete: yes
[FP16]
  armname: FEAT_FP16
  llvmname: fullfp16
  availopt: armv8.2a
  requires: !armv8.4a||FHM
[I8MM]
  armname: FEAT_I8MM
  llvmname: i8mm
  availopt: armv8.1a
  avail: armv8.6a
[PAN2]
  armname: FEAT_PAN2
  llvmname: pan-rwv
  availopt: armv8.1a
  avail: armv8.2a
  requires: PAN
[RAS]
  armname: FEAT_RAS
  llvmname: ras
  availopt: armv8.0a
  avail: armv8.2a
[SHA3]
  armname: FEAT_SHA3
  llvmname: sha3
  availopt: armv8.1a
  requires: SHA256;SHA1
[SHA512]
  armname: FEAT_SHA512
  llvmname: sha3
  availopt: armv8.1a
  requires: SHA256;SHA1
[SM3]
  armname: FEAT_SM3
  llvmname: sm4
  availopt: armv8.1a
[SM4]
  armname: FEAT_SM4
  llvmname: sm4
  availopt: armv8.1a
[SVE]
  armname: FEAT_SVE
  llvmname: sve
  availopt: armv8.2a
  requires: FP16;FCMA
  incomplete: yes, very
[UAO]
  armname: FEAT_UAO
  llvmname: uaops
  availopt: armv8.1a
  avail: armv8.2a

# Features introduced in Armv8.3
[FCMA]
  armname: FEAT_FCMA
  llvmname: complxnum
  availopt: armv8.2a
  avail: armv8.3a
[JSCVT]
  armname: FEAT_JSCVT
  llvmname: jsconv
  availopt: armv8.2a
  avail: armv8.3a
[LRCPC]
  armname: FEAT_LRCPC
  llvmname: rcpc
  availopt: armv8.2a
  avail: armv8.3a
[PAuth]
  armname: FEAT_PAuth
  llvmname: pauth
  availopt: armv8.2a
  avail: armv8.3a

# Features introduced in Armv8.4
[DIT]
  armname: FEAT_DIT
  llvmname: dit
  availopt: armv8.3a
  avail: armv8.4a
[DotProd]
  armname: FEAT_DotProd
  llvmname: dotprod
  availopt: armv8.1a
  avail: armv8.4a
[FHM]
  armname: FEAT_FHM
  llvmname: fp16fml
  availopt: armv8.1a
  requires: FP16
[FlagM]
  armname: FEAT_FlagM
  llvmname: flagm
  availopt: armv8.1a
  avail: armv8.4a
[LRCPC2]
  armname: FEAT_LRCPC2
  llvmname: rcpc-immo
  availopt: armv8.2a
  avail: armv8.4a
[LSE2]
  armname: FEAT_LSE2
  llvmname: lse2
  availopt: armv8.2
  avail: armv8.4
[TLBIOS]
  armname: FEAT_TLBIOS
  llvmname: tlb-rmi
  availopt: armv8.3a
  avail: armv8.4a
[TLBIRANGE]
  armname: FEAT_TLBIRANGE
  llvmname: tlb-rmi
  availopt: armv8.3a
  avail: armv8.4a

# Features introduced in Armv8.5
[BTI]
  armname: FEAT_BTI
  llvmname: bti
  availopt: armv8.4a
  avail: armv8.5a
[DPB2]
  armname: FEAT_DPB2
  llvmname: ccdp
  availopt: armv8.1a
  avail: armv8.5a
  requires: DPB
[FRINTTS]
  armname: FEAT_FRINTTS
  llvmname: fptoint
  availopt: armv8.4a
  avail: armv8.5a
[FlagM2]
  armname: FEAT_FlagM2
  llvmname: altnzcv
  availopt: armv8.4a
  requires: FlagM
[MTE]
  armname: FEAT_MTE
  llvmname: mte
  availopt: armv8.4a
[MTE2]
  armname: FEAT_MTE2
  llvmname: mte
  availopt: armv8.4a
  requires: MTE
[SB]
  armname: FEAT_SB
  llvmname: sb
  availopt: armv8.0a
  avail: armv8.5a
[SSBS]
  armname: FEAT_SSBS
  llvmname: ssbs
  availopt: armv8.0a
[SSBS2]
  armname: FEAT_SSBS2
  llvmname: ssbs
  availopt: armv8.0a
  requires: SSBS

# Features introduced in Armv8.6
[BF16]
  armname: FEAT_BF16
  llvmname: bf16
  availopt: armv8.2a
  avail: armv8.6a
[DGH]
  armname: FEAT_DGH
  availopt: armv8.0a
  note: Hint instruction always available

# Features introduced in Armv8.7
[AFP]
  armname: FEAT_AFP
  availopt: armv8.6a
  avail: armv8.7a
[LS64]
  armname: FEAT_LS64
  llvmname: ls64
  availopt: armv8.6a
[LS64_V]
  armname: FEAT_LS64_V
  llvmname: ls64
  availopt: armv8.6a
  requires: LS64
[LS64_ACCDATA]
  armname: FEAT_LS64_ACCDATA
  llvmname: ls64
  availopt: armv8.6a
  requires: LS64_V
[WFxT]
  armname: FEAT_WFxT
  llvmname: wfxt
  availopt: armv8.6a
  avail: armv8.7a

# Features introduced in Armv8.8
[HBC]
  armname: FEAT_HBC
  llvmname: hbc
  availopt: armv8.7a
  avail: armv8.8a
[MOPS]
  armname: FEAT_MOPS
  llvmname: mops
  availopt: armv8.7a
  avail: armv8.8a
[NMI]
  armname: FEAT_NMI
  llvmname: nmi
  availopt: armv8.7a
  avail: armv8.8a

# Features introduced in Armv8.9
[CLRBHB]
  armname: FEAT_CLRBHB
  llvmname: clrbhb
  availopt: armv8.0a
  avail: armv8.9a
  note: Hint instruction always available
[CSSC]
  armname: FEAT_CSSC
  llvmname: cssc
  availopt: armv8.7a
  avail: armv8.9a
[LRCPC3]
  armname: FEAT_LRCPC3
  llvmname: rcpc3
  availopt: armv8.2a
  requires: LRCPC2
  incomplete: yes
[RPRFM]
  armname: FEAT_RPRFM
  availopt: armv8.0a
  incomplete: yes
[THE]
  armname: FEAT_THE
  llvmname: the
  availopt: armv8.8a
  incomplete: yes

# Features introduced in Armv9.0
# TODO: FEAT_SVE2
# TODO: FEAT_SVE_AES
# TODO: FEAT_SVE_BitPerm
# TODO: FEAT_SVE_PMULL128
# TODO: FEAT_SVE_SHA3
# TODO: FEAT_SVE_SM4
[TME]
  armname: FEAT_TME
  llvmname: tme
  availopt: armv9.0a

# Features introduced in Armv9.2
[SME]
  armname: FEAT_SME
  llvmname: sme
  availopt: armv9.2a
  requires: FCMA;FP16;BF16;FHM
  incomplete: yes
# TODO: FEAT_SME_F64F64
# TODO: FEAT_SME_FA64
# TODO: FEAT_SME_I16I64

# Features introduced in Armv9.3
# TODO: SME2

# Features introduced in Armv9.4
[CHK]
  armname: FEAT_CHK
  llvmname: chk
  avail: armv8.0a
  availopt: armv9.4a
  note: Hint instruction always available
# TODO: D128
[EBEP]
  armname: FEAT_EBEP
  availopt: armv9.3a
[GCS]
  armname: FEAT_GCS
  avail: armv9.3a
  availopt: armv9.4a
  requires: CHK;S1PIE
  note: Hint instruction always available
  incomplete: yes GCSSTR GCSSTTR, SYS decode/encode
# TODO: ITE (SYS TRCIT)
# TODO: LSE128
# TODO: SME2p1
# TODO: SME_F16F16
# TODO: SVE2p1
# TODO: SVE_B16B16
# TODO: SYSINSTR128
# TODO: SYSREG128

# availability TBD
[FAMINMAX]
  armname: FEAT_FAMINMAX
  llvmname: faminmax
  incomplete: yes
[FP8]
  armname: FEAT_FP8
  llvmname: fp8
  incomplete: yes
[FP8DOT4]
  armname: FEAT_FP8DOT4
  incomplete: yes
[FP8DOT2]
  armname: FEAT_FP8DOT2
  incomplete: yes
[FP8FMA]
  armname: FEAT_FP8FMA
  llvmname: fp8fma
  incomplete: yes
[SPE]
  incomplete: yes
[TRF]
  incomplete: yes
[MEC]
  incomplete: yes
[RME]
  incomplete: yes
[TLBIW]
  incomplete: yes
[XS]
  incomplete: yes
[BRBE]
  incomplete: yes
[SPECRES]
  incomplete: yes
[SPECRES2]
  incomplete: yes
[ATS1A]
  incomplete: yes
