1326941Sdim//===--- Lanai.cpp - Implement Lanai target feature support ---------------===//
2326941Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326941Sdim//
7326941Sdim//===----------------------------------------------------------------------===//
8326941Sdim//
9326941Sdim// This file implements Lanai TargetInfo objects.
10326941Sdim//
11326941Sdim//===----------------------------------------------------------------------===//
12326941Sdim
13326941Sdim#include "Lanai.h"
14326941Sdim#include "clang/Basic/MacroBuilder.h"
15326941Sdim#include "llvm/ADT/StringSwitch.h"
16326941Sdim
17326941Sdimusing namespace clang;
18326941Sdimusing namespace clang::targets;
19326941Sdim
20326941Sdimconst char *const LanaiTargetInfo::GCCRegNames[] = {
21326941Sdim    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
22326941Sdim    "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
23326941Sdim    "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
24326941Sdim};
25326941Sdim
26326941SdimArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
27326941Sdim  return llvm::makeArrayRef(GCCRegNames);
28326941Sdim}
29326941Sdim
30326941Sdimconst TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
31326941Sdim    {{"pc"}, "r2"},   {{"sp"}, "r4"},   {{"fp"}, "r5"},   {{"rv"}, "r8"},
32326941Sdim    {{"rr1"}, "r10"}, {{"rr2"}, "r11"}, {{"rca"}, "r15"},
33326941Sdim};
34326941Sdim
35326941SdimArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
36326941Sdim  return llvm::makeArrayRef(GCCRegAliases);
37326941Sdim}
38326941Sdim
39326941Sdimbool LanaiTargetInfo::isValidCPUName(StringRef Name) const {
40326941Sdim  return llvm::StringSwitch<bool>(Name).Case("v11", true).Default(false);
41326941Sdim}
42341825Sdimvoid LanaiTargetInfo::fillValidCPUList(
43341825Sdim    SmallVectorImpl<StringRef> &Values) const {
44341825Sdim  Values.emplace_back("v11");
45341825Sdim}
46326941Sdim
47326941Sdimbool LanaiTargetInfo::setCPU(const std::string &Name) {
48326941Sdim  CPU = llvm::StringSwitch<CPUKind>(Name).Case("v11", CK_V11).Default(CK_NONE);
49326941Sdim
50326941Sdim  return CPU != CK_NONE;
51326941Sdim}
52326941Sdim
53326941Sdimbool LanaiTargetInfo::hasFeature(StringRef Feature) const {
54326941Sdim  return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
55326941Sdim}
56326941Sdim
57326941Sdimvoid LanaiTargetInfo::getTargetDefines(const LangOptions &Opts,
58326941Sdim                                       MacroBuilder &Builder) const {
59326941Sdim  // Define __lanai__ when building for target lanai.
60326941Sdim  Builder.defineMacro("__lanai__");
61326941Sdim
62326941Sdim  // Set define for the CPU specified.
63326941Sdim  switch (CPU) {
64326941Sdim  case CK_V11:
65326941Sdim    Builder.defineMacro("__LANAI_V11__");
66326941Sdim    break;
67326941Sdim  case CK_NONE:
68326941Sdim    llvm_unreachable("Unhandled target CPU");
69326941Sdim  }
70326941Sdim}
71