| 395 | #endif |
| 396 | |
| 397 | static void OverrideFeatures(FEXCore::HostFeatures* Features, uint64_t ForceSVEWidth) { |
| 398 | // Override features if the user has specifically called for it. |
| 399 | FEX_CONFIG_OPT(HostFeatures, HOSTFEATURES); |
| 400 | if (!HostFeatures()) { |
| 401 | // Early exit if no features are overriden. |
| 402 | return; |
| 403 | } |
| 404 | |
| 405 | #define ENABLE_DISABLE_OPTION(FeatureName, name, enum_name) \ |
| 406 | do { \ |
| 407 | const bool Disable##name = (HostFeatures() & FEXCore::Config::HostFeatures::DISABLE##enum_name) != 0; \ |
| 408 | const bool Enable##name = (HostFeatures() & FEXCore::Config::HostFeatures::ENABLE##enum_name) != 0; \ |
| 409 | LogMan::Throw::AFmt(!(Disable##name && Enable##name), "Disabling and Enabling CPU feature (" #name ") is mutually exclusive"); \ |
| 410 | const bool AlreadyEnabled = Features->FeatureName; \ |
| 411 | const bool Result = (AlreadyEnabled | Enable##name) & !Disable##name; \ |
| 412 | Features->FeatureName = Result; \ |
| 413 | } while (0) |
| 414 | |
| 415 | #define GET_SINGLE_OPTION(name, enum_name) \ |
| 416 | const bool Disable##name = (HostFeatures() & FEXCore::Config::HostFeatures::DISABLE##enum_name) != 0; \ |
| 417 | const bool Enable##name = (HostFeatures() & FEXCore::Config::HostFeatures::ENABLE##enum_name) != 0; \ |
| 418 | LogMan::Throw::AFmt(!(Disable##name && Enable##name), "Disabling and Enabling CPU feature (" #name ") is mutually exclusive"); |
| 419 | |
| 420 | ENABLE_DISABLE_OPTION(SupportsAVX, AVX, AVX); |
| 421 | ENABLE_DISABLE_OPTION(SupportsSVE128, SVE, SVE); |
| 422 | ENABLE_DISABLE_OPTION(SupportsAFP, AFP, AFP); |
| 423 | ENABLE_DISABLE_OPTION(SupportsRCPC, LRCPC, LRCPC); |
| 424 | ENABLE_DISABLE_OPTION(SupportsTSOImm9, LRCPC2, LRCPC2); |
| 425 | ENABLE_DISABLE_OPTION(SupportsCSSC, CSSC, CSSC); |
| 426 | ENABLE_DISABLE_OPTION(SupportsPMULL_128Bit, PMULL128, PMULL128); |
| 427 | ENABLE_DISABLE_OPTION(SupportsRAND, RNG, RNG); |
| 428 | ENABLE_DISABLE_OPTION(SupportsCLZERO, CLZERO, CLZERO); |
| 429 | ENABLE_DISABLE_OPTION(SupportsAtomics, Atomics, ATOMICS); |
| 430 | ENABLE_DISABLE_OPTION(SupportsFCMA, FCMA, FCMA); |
| 431 | ENABLE_DISABLE_OPTION(SupportsFlagM, FlagM, FLAGM); |
| 432 | ENABLE_DISABLE_OPTION(SupportsFlagM2, FlagM2, FLAGM2); |
| 433 | ENABLE_DISABLE_OPTION(SupportsFRINTTS, FRINTTS, FRINTTS); |
| 434 | ENABLE_DISABLE_OPTION(SupportsRPRES, RPRES, RPRES); |
| 435 | ENABLE_DISABLE_OPTION(SupportsSVEBitPerm, SVEBITPERM, SVEBITPERM); |
| 436 | ENABLE_DISABLE_OPTION(SupportsPreserveAllABI, PRESERVEALLABI, PRESERVEALLABI); |
| 437 | ENABLE_DISABLE_OPTION(SupportsWFXT, WFXT, WFXT); |
| 438 | ENABLE_DISABLE_OPTION(Supports3DNow, 3DNOW, 3DNOW); |
| 439 | GET_SINGLE_OPTION(Crypto, CRYPTO); |
| 440 | |
| 441 | #undef ENABLE_DISABLE_OPTION |
| 442 | #undef GET_SINGLE_OPTION |
| 443 | |
| 444 | if (EnableCrypto) { |
| 445 | Features->SupportsAES = true; |
| 446 | Features->SupportsCRC = true; |
| 447 | Features->SupportsSHA = true; |
| 448 | Features->SupportsPMULL_128Bit = true; |
| 449 | Features->SupportsAES256 = true; |
| 450 | } else if (DisableCrypto) { |
| 451 | Features->SupportsAES = false; |
| 452 | Features->SupportsCRC = false; |
| 453 | Features->SupportsSHA = false; |
| 454 | Features->SupportsPMULL_128Bit = false; |
no test coverage detected