blob: 2dc9cdf94f7fcaf803b66498201cdb526b926f4f [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- SystemZ.cpp - Implement SystemZ target feature support -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements SystemZ TargetInfo objects.
11//
12//===----------------------------------------------------------------------===//
13
14#include "SystemZ.h"
15#include "clang/Basic/Builtins.h"
16#include "clang/Basic/LangOptions.h"
17#include "clang/Basic/MacroBuilder.h"
18#include "clang/Basic/TargetBuiltins.h"
19#include "llvm/ADT/StringSwitch.h"
20
21using namespace clang;
22using namespace clang::targets;
23
24const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
25#define BUILTIN(ID, TYPE, ATTRS) \
26 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
27#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
28 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
29#include "clang/Basic/BuiltinsSystemZ.def"
30};
31
32const char *const SystemZTargetInfo::GCCRegNames[] = {
Ulrich Weigande1d2d222018-01-16 15:39:23 +000033 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
34 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
35 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
36 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15",
37 /*ap*/"", "cc", /*fp*/"", /*rp*/"", "a0", "a1",
38 "v16", "v18", "v20", "v22", "v17", "v19", "v21", "v23",
39 "v24", "v26", "v28", "v30", "v25", "v27", "v29", "v31"
40};
41
42const TargetInfo::AddlRegName GCCAddlRegNames[] = {
43 {{"v0"}, 16}, {{"v2"}, 17}, {{"v4"}, 18}, {{"v6"}, 19},
44 {{"v1"}, 20}, {{"v3"}, 21}, {{"v5"}, 22}, {{"v7"}, 23},
45 {{"v8"}, 24}, {{"v10"}, 25}, {{"v12"}, 26}, {{"v14"}, 27},
46 {{"v9"}, 28}, {{"v11"}, 29}, {{"v13"}, 30}, {{"v15"}, 31}
Erich Keaneebba5922017-07-21 22:37:03 +000047};
48
49ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
50 return llvm::makeArrayRef(GCCRegNames);
51}
52
Ulrich Weigande1d2d222018-01-16 15:39:23 +000053ArrayRef<TargetInfo::AddlRegName> SystemZTargetInfo::getGCCAddlRegNames() const {
54 return llvm::makeArrayRef(GCCAddlRegNames);
55}
56
Erich Keaneebba5922017-07-21 22:37:03 +000057bool SystemZTargetInfo::validateAsmConstraint(
58 const char *&Name, TargetInfo::ConstraintInfo &Info) const {
59 switch (*Name) {
60 default:
61 return false;
62
63 case 'a': // Address register
64 case 'd': // Data register (equivalent to 'r')
65 case 'f': // Floating-point register
Ulrich Weigande1d2d222018-01-16 15:39:23 +000066 case 'v': // Vector register
Erich Keaneebba5922017-07-21 22:37:03 +000067 Info.setAllowsRegister();
68 return true;
69
70 case 'I': // Unsigned 8-bit constant
71 case 'J': // Unsigned 12-bit constant
72 case 'K': // Signed 16-bit constant
73 case 'L': // Signed 20-bit displacement (on all targets we support)
74 case 'M': // 0x7fffffff
75 return true;
76
77 case 'Q': // Memory with base and unsigned 12-bit displacement
78 case 'R': // Likewise, plus an index
79 case 'S': // Memory with base and signed 20-bit displacement
80 case 'T': // Likewise, plus an index
81 Info.setAllowsMemory();
82 return true;
83 }
84}
85
86int SystemZTargetInfo::getISARevision(const StringRef &Name) const {
87 return llvm::StringSwitch<int>(Name)
88 .Cases("arch8", "z10", 8)
89 .Cases("arch9", "z196", 9)
90 .Cases("arch10", "zEC12", 10)
91 .Cases("arch11", "z13", 11)
92 .Cases("arch12", "z14", 12)
93 .Default(-1);
94}
95
96bool SystemZTargetInfo::hasFeature(StringRef Feature) const {
97 return llvm::StringSwitch<bool>(Feature)
98 .Case("systemz", true)
99 .Case("arch8", ISARevision >= 8)
100 .Case("arch9", ISARevision >= 9)
101 .Case("arch10", ISARevision >= 10)
102 .Case("arch11", ISARevision >= 11)
103 .Case("arch12", ISARevision >= 12)
104 .Case("htm", HasTransactionalExecution)
105 .Case("vx", HasVector)
106 .Default(false);
107}
108
109void SystemZTargetInfo::getTargetDefines(const LangOptions &Opts,
110 MacroBuilder &Builder) const {
111 Builder.defineMacro("__s390__");
112 Builder.defineMacro("__s390x__");
113 Builder.defineMacro("__zarch__");
114 Builder.defineMacro("__LONG_DOUBLE_128__");
115
116 Builder.defineMacro("__ARCH__", Twine(ISARevision));
117
118 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
119 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
120 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
121 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
122
123 if (HasTransactionalExecution)
124 Builder.defineMacro("__HTM__");
125 if (HasVector)
126 Builder.defineMacro("__VX__");
127 if (Opts.ZVector)
128 Builder.defineMacro("__VEC__", "10302");
129}
130
131ArrayRef<Builtin::Info> SystemZTargetInfo::getTargetBuiltins() const {
132 return llvm::makeArrayRef(BuiltinInfo, clang::SystemZ::LastTSBuiltin -
133 Builtin::FirstTSBuiltin);
134}