1e5dd7070Spatrick //===--- Lanai.cpp - Implement Lanai target feature support ---------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This file implements Lanai TargetInfo objects.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick
13e5dd7070Spatrick #include "Lanai.h"
14e5dd7070Spatrick #include "clang/Basic/MacroBuilder.h"
15e5dd7070Spatrick #include "llvm/ADT/StringSwitch.h"
16e5dd7070Spatrick
17e5dd7070Spatrick using namespace clang;
18e5dd7070Spatrick using namespace clang::targets;
19e5dd7070Spatrick
20e5dd7070Spatrick const char *const LanaiTargetInfo::GCCRegNames[] = {
21e5dd7070Spatrick "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
22e5dd7070Spatrick "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
23e5dd7070Spatrick "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
24e5dd7070Spatrick };
25e5dd7070Spatrick
getGCCRegNames() const26e5dd7070Spatrick ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
27*12c85518Srobert return llvm::ArrayRef(GCCRegNames);
28e5dd7070Spatrick }
29e5dd7070Spatrick
30e5dd7070Spatrick const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
31e5dd7070Spatrick {{"pc"}, "r2"}, {{"sp"}, "r4"}, {{"fp"}, "r5"}, {{"rv"}, "r8"},
32e5dd7070Spatrick {{"rr1"}, "r10"}, {{"rr2"}, "r11"}, {{"rca"}, "r15"},
33e5dd7070Spatrick };
34e5dd7070Spatrick
getGCCRegAliases() const35e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
36*12c85518Srobert return llvm::ArrayRef(GCCRegAliases);
37e5dd7070Spatrick }
38e5dd7070Spatrick
isValidCPUName(StringRef Name) const39e5dd7070Spatrick bool LanaiTargetInfo::isValidCPUName(StringRef Name) const {
40e5dd7070Spatrick return llvm::StringSwitch<bool>(Name).Case("v11", true).Default(false);
41e5dd7070Spatrick }
fillValidCPUList(SmallVectorImpl<StringRef> & Values) const42e5dd7070Spatrick void LanaiTargetInfo::fillValidCPUList(
43e5dd7070Spatrick SmallVectorImpl<StringRef> &Values) const {
44e5dd7070Spatrick Values.emplace_back("v11");
45e5dd7070Spatrick }
46e5dd7070Spatrick
setCPU(const std::string & Name)47e5dd7070Spatrick bool LanaiTargetInfo::setCPU(const std::string &Name) {
48e5dd7070Spatrick CPU = llvm::StringSwitch<CPUKind>(Name).Case("v11", CK_V11).Default(CK_NONE);
49e5dd7070Spatrick
50e5dd7070Spatrick return CPU != CK_NONE;
51e5dd7070Spatrick }
52e5dd7070Spatrick
hasFeature(StringRef Feature) const53e5dd7070Spatrick bool LanaiTargetInfo::hasFeature(StringRef Feature) const {
54e5dd7070Spatrick return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
55e5dd7070Spatrick }
56e5dd7070Spatrick
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const57e5dd7070Spatrick void LanaiTargetInfo::getTargetDefines(const LangOptions &Opts,
58e5dd7070Spatrick MacroBuilder &Builder) const {
59e5dd7070Spatrick // Define __lanai__ when building for target lanai.
60e5dd7070Spatrick Builder.defineMacro("__lanai__");
61e5dd7070Spatrick
62e5dd7070Spatrick // Set define for the CPU specified.
63e5dd7070Spatrick switch (CPU) {
64e5dd7070Spatrick case CK_V11:
65e5dd7070Spatrick Builder.defineMacro("__LANAI_V11__");
66e5dd7070Spatrick break;
67e5dd7070Spatrick case CK_NONE:
68e5dd7070Spatrick llvm_unreachable("Unhandled target CPU");
69e5dd7070Spatrick }
70e5dd7070Spatrick }
71