instruction_set.cc revision 83b1940e6482b9d8feba5c492507735686650ea5
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "instruction_set.h"
18
19namespace art {
20
21const char* GetInstructionSetString(const InstructionSet isa) {
22  switch (isa) {
23    case kArm:
24    case kThumb2:
25      return "arm";
26    case kArm64:
27      return "arm64";
28    case kX86:
29      return "x86";
30    case kX86_64:
31      return "x86_64";
32    case kMips:
33      return "mips";
34    case kNone:
35      return "none";
36    default:
37      LOG(FATAL) << "Unknown ISA " << isa;
38      return nullptr;
39  }
40}
41
42InstructionSet GetInstructionSetFromString(const char* isa_str) {
43  CHECK(isa_str != nullptr);
44
45  if (!strcmp("arm", isa_str)) {
46    return kArm;
47  } else if (!strcmp("arm64", isa_str)) {
48    return kArm64;
49  } else if (!strcmp("x86", isa_str)) {
50    return kX86;
51  } else if (!strcmp("x86_64", isa_str)) {
52    return kX86_64;
53  } else if (!strcmp("mips", isa_str)) {
54    return kMips;
55  } else if (!strcmp("none", isa_str)) {
56    return kNone;
57  }
58
59  LOG(FATAL) << "Unknown ISA " << isa_str;
60  return kNone;
61}
62
63size_t GetInstructionSetAlignment(InstructionSet isa) {
64  switch (isa) {
65    case kArm:
66      // Fall-through.
67    case kThumb2:
68      return kArmAlignment;
69    case kArm64:
70      return kArm64Alignment;
71    case kX86:
72      // Fall-through.
73    case kX86_64:
74      return kX86Alignment;
75    case kMips:
76      return kMipsAlignment;
77    case kNone:
78      LOG(FATAL) << "ISA kNone does not have alignment.";
79      return 0;
80    default:
81      LOG(FATAL) << "Unknown ISA " << isa;
82      return 0;
83  }
84}
85
86
87static constexpr size_t kDefaultStackOverflowReservedBytes = 16 * KB;
88static constexpr size_t kMipsStackOverflowReservedBytes = kDefaultStackOverflowReservedBytes;
89
90// TODO: Lower once implicit stack-overflow checks can work with less than 16K.
91static constexpr size_t kArmStackOverflowReservedBytes =    (kIsDebugBuild ? 16 : 16) * KB;
92static constexpr size_t kArm64StackOverflowReservedBytes =  (kIsDebugBuild ? 16 : 16) * KB;
93static constexpr size_t kX86StackOverflowReservedBytes =    (kIsDebugBuild ? 16 : 16) * KB;
94static constexpr size_t kX86_64StackOverflowReservedBytes = (kIsDebugBuild ? 16 : 16) * KB;
95
96size_t GetStackOverflowReservedBytes(InstructionSet isa) {
97  switch (isa) {
98    case kArm:      // Intentional fall-through.
99    case kThumb2:
100      return kArmStackOverflowReservedBytes;
101
102    case kArm64:
103      return kArm64StackOverflowReservedBytes;
104
105    case kMips:
106      return kMipsStackOverflowReservedBytes;
107
108    case kX86:
109      return kX86StackOverflowReservedBytes;
110
111    case kX86_64:
112      return kX86_64StackOverflowReservedBytes;
113
114    case kNone:
115      LOG(FATAL) << "kNone has no stack overflow size";
116      return 0;
117
118    default:
119      LOG(FATAL) << "Unknown instruction set" << isa;
120      return 0;
121  }
122}
123
124std::string InstructionSetFeatures::GetFeatureString() const {
125  std::string result;
126  if ((mask_ & kHwDiv) != 0) {
127    result += "div";
128  }
129  if (result.size() == 0) {
130    result = "none";
131  }
132  return result;
133}
134
135}  // namespace art
136