|
15 | 15 | #include "clang/Basic/MacroBuilder.h"
|
16 | 16 | #include "clang/Basic/TargetBuiltins.h"
|
17 | 17 | #include "llvm/TargetParser/PPCTargetParser.h"
|
| 18 | +#include <optional> |
18 | 19 |
|
19 | 20 | using namespace clang;
|
20 | 21 | using namespace clang::targets;
|
@@ -516,129 +517,14 @@ static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
|
516 | 517 | bool PPCTargetInfo::initFeatureMap(
|
517 | 518 | llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
|
518 | 519 | const std::vector<std::string> &FeaturesVec) const {
|
519 |
| - Features["altivec"] = llvm::StringSwitch<bool>(CPU) |
520 |
| - .Case("7400", true) |
521 |
| - .Case("g4", true) |
522 |
| - .Case("7450", true) |
523 |
| - .Case("g4+", true) |
524 |
| - .Case("970", true) |
525 |
| - .Case("g5", true) |
526 |
| - .Case("pwr6", true) |
527 |
| - .Case("pwr7", true) |
528 |
| - .Case("pwr8", true) |
529 |
| - .Case("pwr9", true) |
530 |
| - .Case("ppc64", true) |
531 |
| - .Case("ppc64le", true) |
532 |
| - .Default(false); |
533 |
| - |
534 |
| - Features["power9-vector"] = (CPU == "pwr9"); |
535 |
| - Features["crypto"] = llvm::StringSwitch<bool>(CPU) |
536 |
| - .Case("ppc64le", true) |
537 |
| - .Case("pwr9", true) |
538 |
| - .Case("pwr8", true) |
539 |
| - .Default(false); |
540 |
| - Features["power8-vector"] = llvm::StringSwitch<bool>(CPU) |
541 |
| - .Case("ppc64le", true) |
542 |
| - .Case("pwr9", true) |
543 |
| - .Case("pwr8", true) |
544 |
| - .Default(false); |
545 |
| - Features["bpermd"] = llvm::StringSwitch<bool>(CPU) |
546 |
| - .Case("ppc64le", true) |
547 |
| - .Case("pwr9", true) |
548 |
| - .Case("pwr8", true) |
549 |
| - .Case("pwr7", true) |
550 |
| - .Default(false); |
551 |
| - Features["extdiv"] = llvm::StringSwitch<bool>(CPU) |
552 |
| - .Case("ppc64le", true) |
553 |
| - .Case("pwr9", true) |
554 |
| - .Case("pwr8", true) |
555 |
| - .Case("pwr7", true) |
556 |
| - .Default(false); |
557 |
| - Features["direct-move"] = llvm::StringSwitch<bool>(CPU) |
558 |
| - .Case("ppc64le", true) |
559 |
| - .Case("pwr9", true) |
560 |
| - .Case("pwr8", true) |
561 |
| - .Default(false); |
562 |
| - Features["crbits"] = llvm::StringSwitch<bool>(CPU) |
563 |
| - .Case("ppc64le", true) |
564 |
| - .Case("pwr9", true) |
565 |
| - .Case("pwr8", true) |
566 |
| - .Default(false); |
567 |
| - Features["vsx"] = llvm::StringSwitch<bool>(CPU) |
568 |
| - .Case("ppc64le", true) |
569 |
| - .Case("pwr9", true) |
570 |
| - .Case("pwr8", true) |
571 |
| - .Case("pwr7", true) |
572 |
| - .Default(false); |
573 |
| - Features["htm"] = llvm::StringSwitch<bool>(CPU) |
574 |
| - .Case("ppc64le", true) |
575 |
| - .Case("pwr9", true) |
576 |
| - .Case("pwr8", true) |
577 |
| - .Default(false); |
578 |
| - |
579 |
| - // ROP Protect is off by default. |
580 |
| - Features["rop-protect"] = false; |
581 |
| - // Privileged instructions are off by default. |
582 |
| - Features["privileged"] = false; |
583 | 520 |
|
584 |
| - if (getTriple().isOSAIX()) { |
585 |
| - // The code generated by the -maix-small-local-[exec|dynamic]-tls option is |
586 |
| - // turned off by default. |
587 |
| - Features["aix-small-local-exec-tls"] = false; |
588 |
| - Features["aix-small-local-dynamic-tls"] = false; |
589 |
| - |
590 |
| - // Turn off TLS model opt by default. |
591 |
| - Features["aix-shared-lib-tls-model-opt"] = false; |
592 |
| - } |
593 |
| - |
594 |
| - Features["spe"] = llvm::StringSwitch<bool>(CPU) |
595 |
| - .Case("8548", true) |
596 |
| - .Case("e500", true) |
597 |
| - .Default(false); |
598 |
| - |
599 |
| - Features["isa-v206-instructions"] = llvm::StringSwitch<bool>(CPU) |
600 |
| - .Case("ppc64le", true) |
601 |
| - .Case("pwr9", true) |
602 |
| - .Case("pwr8", true) |
603 |
| - .Case("pwr7", true) |
604 |
| - .Case("a2", true) |
605 |
| - .Default(false); |
606 |
| - |
607 |
| - Features["isa-v207-instructions"] = llvm::StringSwitch<bool>(CPU) |
608 |
| - .Case("ppc64le", true) |
609 |
| - .Case("pwr9", true) |
610 |
| - .Case("pwr8", true) |
611 |
| - .Default(false); |
612 |
| - |
613 |
| - Features["isa-v30-instructions"] = |
614 |
| - llvm::StringSwitch<bool>(CPU).Case("pwr9", true).Default(false); |
615 |
| - |
616 |
| - Features["quadword-atomics"] = |
617 |
| - getTriple().isArch64Bit() && llvm::StringSwitch<bool>(CPU) |
618 |
| - .Case("pwr9", true) |
619 |
| - .Case("pwr8", true) |
620 |
| - .Default(false); |
621 |
| - |
622 |
| - // Power10 includes all the same features as Power9 plus any features specific |
623 |
| - // to the Power10 core. |
624 |
| - if (CPU == "pwr10" || CPU == "power10") { |
625 |
| - initFeatureMap(Features, Diags, "pwr9", FeaturesVec); |
626 |
| - addP10SpecificFeatures(Features); |
627 |
| - } |
628 |
| - |
629 |
| - // Power11 includes all the same features as Power10 plus any features |
630 |
| - // specific to the Power11 core. |
631 |
| - if (CPU == "pwr11" || CPU == "power11") { |
632 |
| - initFeatureMap(Features, Diags, "pwr10", FeaturesVec); |
633 |
| - addP11SpecificFeatures(Features); |
634 |
| - } |
| 521 | + const llvm::Triple &TheTriple = getTriple(); |
635 | 522 |
|
636 |
| - // Future CPU should include all of the features of Power 11 as well as any |
637 |
| - // additional features (yet to be determined) specific to it. |
638 |
| - if (CPU == "future") { |
639 |
| - initFeatureMap(Features, Diags, "pwr11", FeaturesVec); |
640 |
| - addFutureSpecificFeatures(Features); |
641 |
| - } |
| 523 | + std::optional<llvm::StringMap<bool>> FeaturesOpt = |
| 524 | + llvm::PPC::getPPCDefaultTargetFeatures(TheTriple, |
| 525 | + llvm::PPC::normalizeCPUName(CPU)); |
| 526 | + if (FeaturesOpt) |
| 527 | + Features = FeaturesOpt.value(); |
642 | 528 |
|
643 | 529 | if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
|
644 | 530 | return false;
|
@@ -700,26 +586,6 @@ bool PPCTargetInfo::initFeatureMap(
|
700 | 586 | return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
|
701 | 587 | }
|
702 | 588 |
|
703 |
| -// Add any Power10 specific features. |
704 |
| -void PPCTargetInfo::addP10SpecificFeatures( |
705 |
| - llvm::StringMap<bool> &Features) const { |
706 |
| - Features["htm"] = false; // HTM was removed for P10. |
707 |
| - Features["paired-vector-memops"] = true; |
708 |
| - Features["mma"] = true; |
709 |
| - Features["power10-vector"] = true; |
710 |
| - Features["pcrelative-memops"] = true; |
711 |
| - Features["prefix-instrs"] = true; |
712 |
| - Features["isa-v31-instructions"] = true; |
713 |
| -} |
714 |
| - |
715 |
| -// Add any Power11 specific features. |
716 |
| -void PPCTargetInfo::addP11SpecificFeatures( |
717 |
| - llvm::StringMap<bool> &Features) const {} |
718 |
| - |
719 |
| -// Add features specific to the "Future" CPU. |
720 |
| -void PPCTargetInfo::addFutureSpecificFeatures( |
721 |
| - llvm::StringMap<bool> &Features) const {} |
722 |
| - |
723 | 589 | bool PPCTargetInfo::hasFeature(StringRef Feature) const {
|
724 | 590 | return llvm::StringSwitch<bool>(Feature)
|
725 | 591 | .Case("powerpc", true)
|
|
0 commit comments