125482b35SChen Zheng //===---- PPCTargetParser.cpp - Parser for target features ------*- C++ -*-===// 225482b35SChen Zheng // 325482b35SChen Zheng // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 425482b35SChen Zheng // See https://llvm.org/LICENSE.txt for license information. 525482b35SChen Zheng // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 625482b35SChen Zheng // 725482b35SChen Zheng //===----------------------------------------------------------------------===// 825482b35SChen Zheng // 925482b35SChen Zheng // This file implements a target parser to recognise hardware features 1025482b35SChen Zheng // for PPC CPUs. 1125482b35SChen Zheng // 1225482b35SChen Zheng //===----------------------------------------------------------------------===// 1325482b35SChen Zheng 1425482b35SChen Zheng #include "llvm/TargetParser/PPCTargetParser.h" 1525482b35SChen Zheng #include "llvm/ADT/StringSwitch.h" 1625482b35SChen Zheng #include "llvm/TargetParser/Host.h" 1725482b35SChen Zheng 1825482b35SChen Zheng namespace llvm { 1925482b35SChen Zheng namespace PPC { 2025482b35SChen Zheng 2125482b35SChen Zheng struct CPUInfo { 2225482b35SChen Zheng StringLiteral Name; 2325482b35SChen Zheng // FIXME: add the features field for this CPU. 2425482b35SChen Zheng }; 2525482b35SChen Zheng 2625482b35SChen Zheng constexpr CPUInfo PPCCPUInfo[] = { 2725482b35SChen Zheng #define PPC_CPU(Name, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \ 2825482b35SChen Zheng AIXID) \ 2974fcb6aaSKazu Hirata {Name}, 3025482b35SChen Zheng #include "llvm/TargetParser/PPCTargetParser.def" 3125482b35SChen Zheng }; 3225482b35SChen Zheng 3325482b35SChen Zheng static const CPUInfo *getCPUInfoByName(StringRef CPU) { 3425482b35SChen Zheng for (auto &C : PPCCPUInfo) 3525482b35SChen Zheng if (C.Name == CPU) 3625482b35SChen Zheng return &C; 3725482b35SChen Zheng return nullptr; 3825482b35SChen Zheng } 3925482b35SChen Zheng 4025482b35SChen Zheng StringRef normalizeCPUName(StringRef CPUName) { 4125482b35SChen Zheng // Clang/LLVM does not actually support code generation 4225482b35SChen Zheng // for the 405 CPU. However, there are uses of this CPU ID 4325482b35SChen Zheng // in projects that previously used GCC and rely on Clang 4425482b35SChen Zheng // accepting it. Clang has always ignored it and passed the 4525482b35SChen Zheng // generic CPU ID to the back end. 4625482b35SChen Zheng return StringSwitch<StringRef>(CPUName) 4725482b35SChen Zheng .Cases("common", "405", "generic") 4825482b35SChen Zheng .Cases("ppc440", "440fp", "440") 4925482b35SChen Zheng .Cases("630", "power3", "pwr3") 5025482b35SChen Zheng .Case("G3", "g3") 5125482b35SChen Zheng .Case("G4", "g4") 5225482b35SChen Zheng .Case("G4+", "g4+") 5325482b35SChen Zheng .Case("8548", "e500") 5425482b35SChen Zheng .Case("ppc970", "970") 5525482b35SChen Zheng .Case("G5", "g5") 5625482b35SChen Zheng .Case("ppca2", "a2") 5725482b35SChen Zheng .Case("power4", "pwr4") 5825482b35SChen Zheng .Case("power5", "pwr5") 5925482b35SChen Zheng .Case("power5x", "pwr5x") 6025482b35SChen Zheng .Case("power5+", "pwr5+") 6125482b35SChen Zheng .Case("power6", "pwr6") 6225482b35SChen Zheng .Case("power6x", "pwr6x") 6325482b35SChen Zheng .Case("power7", "pwr7") 6425482b35SChen Zheng .Case("power8", "pwr8") 6525482b35SChen Zheng .Case("power9", "pwr9") 6625482b35SChen Zheng .Case("power10", "pwr10") 6725482b35SChen Zheng .Case("power11", "pwr11") 6825482b35SChen Zheng .Cases("powerpc", "powerpc32", "ppc") 6925482b35SChen Zheng .Case("powerpc64", "ppc64") 7025482b35SChen Zheng .Case("powerpc64le", "ppc64le") 7125482b35SChen Zheng .Default(CPUName); 7225482b35SChen Zheng } 7325482b35SChen Zheng 7425482b35SChen Zheng void fillValidCPUList(SmallVectorImpl<StringRef> &Values) { 7525482b35SChen Zheng for (const auto &C : PPCCPUInfo) 7625482b35SChen Zheng Values.emplace_back(C.Name); 7725482b35SChen Zheng } 7825482b35SChen Zheng 7925482b35SChen Zheng void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) { 8025482b35SChen Zheng for (const auto &C : PPCCPUInfo) 8125482b35SChen Zheng Values.emplace_back(C.Name); 8225482b35SChen Zheng } 8325482b35SChen Zheng 8425482b35SChen Zheng bool isValidCPU(StringRef CPU) { 8525482b35SChen Zheng const CPUInfo *Info = getCPUInfoByName(CPU); 8625482b35SChen Zheng if (!Info) 8725482b35SChen Zheng return false; 8825482b35SChen Zheng return true; 8925482b35SChen Zheng } 9025482b35SChen Zheng 9125482b35SChen Zheng StringRef getNormalizedPPCTargetCPU(const Triple &T, StringRef CPUName) { 9225482b35SChen Zheng if (!CPUName.empty()) { 9325482b35SChen Zheng if (CPUName == "native") { 9474fcb6aaSKazu Hirata StringRef CPU = sys::getHostCPUName(); 9525482b35SChen Zheng if (!CPU.empty() && CPU != "generic") 9625482b35SChen Zheng return CPU; 9725482b35SChen Zheng } 9825482b35SChen Zheng 9925482b35SChen Zheng StringRef CPU = normalizeCPUName(CPUName); 100*d311edd0SChen Zheng if (CPU != "generic" && CPU != "native") 10125482b35SChen Zheng return CPU; 10225482b35SChen Zheng } 10325482b35SChen Zheng 10425482b35SChen Zheng // LLVM may default to generating code for the native CPU, but, like gcc, we 10525482b35SChen Zheng // default to a more generic option for each architecture. (except on AIX) 10625482b35SChen Zheng if (T.isOSAIX()) 10725482b35SChen Zheng return "pwr7"; 10825482b35SChen Zheng else if (T.getArch() == Triple::ppc64le) 10925482b35SChen Zheng return "ppc64le"; 11025482b35SChen Zheng else if (T.getArch() == Triple::ppc64) 11125482b35SChen Zheng return "ppc64"; 11225482b35SChen Zheng 11325482b35SChen Zheng return "ppc"; 11425482b35SChen Zheng } 11525482b35SChen Zheng 11625482b35SChen Zheng StringRef getNormalizedPPCTuneCPU(const Triple &T, StringRef CPUName) { 11725482b35SChen Zheng return getNormalizedPPCTargetCPU(T, CPUName); 11825482b35SChen Zheng } 11925482b35SChen Zheng 12025482b35SChen Zheng } // namespace PPC 12125482b35SChen Zheng } // namespace llvm 122