Loading...
/*
 * Copyright (c) 2024 Apple Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_LICENSE_HEADER_END@
 */




//
// included by:
//   ld to convert function variant name(s) to required flag bits
//   dyld to initialize actual flags bits
//
// FUNCTION_VARIANT_ARM64(_reqFlagBitNum, _name, _flagBitsInitialization)
//


//
//  arm64 processor specific function variants
//
FUNCTION_VARIANT_ARM64( 0, "default",    true )

// These were added in Spring 2025
FUNCTION_VARIANT_ARM64( 1, "flagm",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FlagM))   )
FUNCTION_VARIANT_ARM64( 2, "flagm2",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FlagM2))  )
FUNCTION_VARIANT_ARM64( 3, "fhm",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FHM))     )
FUNCTION_VARIANT_ARM64( 4, "dotprod",   (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_DotProd)) )
FUNCTION_VARIANT_ARM64( 5, "sha3",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SHA3))    )
FUNCTION_VARIANT_ARM64( 6, "rdm",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_RDM))     )
FUNCTION_VARIANT_ARM64( 7, "lse",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_LSE))     )
FUNCTION_VARIANT_ARM64( 8, "sha256",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SHA256))  )
FUNCTION_VARIANT_ARM64( 9, "sha512",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SHA512))  )
FUNCTION_VARIANT_ARM64(10, "sha1",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SHA1))    )
FUNCTION_VARIANT_ARM64(11, "aes",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_AES))     )
FUNCTION_VARIANT_ARM64(12, "pmull",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_PMULL))   )
FUNCTION_VARIANT_ARM64(13, "specres",   (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SPECRES)) )
FUNCTION_VARIANT_ARM64(14, "sb",        (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SB))      )
FUNCTION_VARIANT_ARM64(15, "frintts",   (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FRINTTS)) )
FUNCTION_VARIANT_ARM64(16, "lrcpc",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_LRCPC))   )
FUNCTION_VARIANT_ARM64(17, "lrcpc2",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_LRCPC2))  )
FUNCTION_VARIANT_ARM64(18, "fcma",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FCMA))    )
FUNCTION_VARIANT_ARM64(19, "jscvt",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_JSCVT))   )
FUNCTION_VARIANT_ARM64(20, "PAuth",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_PAuth))   )
FUNCTION_VARIANT_ARM64(21, "PAuth2",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_PAuth2))  )
FUNCTION_VARIANT_ARM64(22, "fpac",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FPAC))    )
FUNCTION_VARIANT_ARM64(23, "dpb",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_DPB))     )
FUNCTION_VARIANT_ARM64(24, "dpb2",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_DPB2))    )
FUNCTION_VARIANT_ARM64(25, "bf16",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_BF16))    )
FUNCTION_VARIANT_ARM64(26, "i8mm",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_I8MM))    )
FUNCTION_VARIANT_ARM64(27, "WFxT",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_WFxT))    )
FUNCTION_VARIANT_ARM64(28, "rpres",     (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_RPRES))   )
FUNCTION_VARIANT_ARM64(29, "ecv",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_ECV))     )
FUNCTION_VARIANT_ARM64(30, "afp",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_AFP))     )
FUNCTION_VARIANT_ARM64(31, "lse2",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_LSE2))    )
FUNCTION_VARIANT_ARM64(32, "csv2",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_CSV2))    )
FUNCTION_VARIANT_ARM64(33, "cvs3",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_CSV3))    )
FUNCTION_VARIANT_ARM64(34, "dit",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_DIT))     )
FUNCTION_VARIANT_ARM64(35, "fp16",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_FP16))    )
FUNCTION_VARIANT_ARM64(36, "ssbs",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SSBS))    )
FUNCTION_VARIANT_ARM64(37, "bti",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_BTI))     )


FUNCTION_VARIANT_ARM64(44, "sme",        (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SME))         )
FUNCTION_VARIANT_ARM64(45, "sme2",       (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SME2))        )
FUNCTION_VARIANT_ARM64(46, "smef64f64",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SME_F64F64))  )
FUNCTION_VARIANT_ARM64(47, "smei16i64",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_FEAT_SME_I16I64))  )
FUNCTION_VARIANT_ARM64(48, "smef32f32",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_F32F32))       )
FUNCTION_VARIANT_ARM64(49, "smebi32i32", (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_BI32I32))      )
FUNCTION_VARIANT_ARM64(50, "smeb16f32",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_B16F32))       )
FUNCTION_VARIANT_ARM64(51, "smef16f32",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_F16F32))       )
FUNCTION_VARIANT_ARM64(52, "smei8i32",   (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_I8I32))        )
FUNCTION_VARIANT_ARM64(53, "smei16i32",  (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_SME_I16I32))       )
FUNCTION_VARIANT_ARM64(54, "AdvSIMD",    (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_AdvSIMD))          )
FUNCTION_VARIANT_ARM64(55, "AdvSIMDHpfp",(hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_AdvSIMD_HPFPCvt))  )  // name?
FUNCTION_VARIANT_ARM64(56, "crc32",      (hw_opt_arm_caps & ((__uint128_t)1 << CAP_BIT_CRC32))            )



// These were added in Fall 2025