instruction_set.cc revision 63c051a540e6dfc806f656b88ac3a63e99395429
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
90static constexpr size_t kArmStackOverflowReservedBytes =    8 * KB;
91static constexpr size_t kArm64StackOverflowReservedBytes =  8 * KB;
92static constexpr size_t kX86StackOverflowReservedBytes =    8 * KB;
93static constexpr size_t kX86_64StackOverflowReservedBytes = 8 * KB;
94
95size_t GetStackOverflowReservedBytes(InstructionSet isa) {
96  switch (isa) {
97    case kArm:      // Intentional fall-through.
98    case kThumb2:
99      return kArmStackOverflowReservedBytes;
100
101    case kArm64:
102      return kArm64StackOverflowReservedBytes;
103
104    case kMips:
105      return kMipsStackOverflowReservedBytes;
106
107    case kX86:
108      return kX86StackOverflowReservedBytes;
109
110    case kX86_64:
111      return kX86_64StackOverflowReservedBytes;
112
113    case kNone:
114      LOG(FATAL) << "kNone has no stack overflow size";
115      return 0;
116
117    default:
118      LOG(FATAL) << "Unknown instruction set" << isa;
119      return 0;
120  }
121}
122
123std::string InstructionSetFeatures::GetFeatureString() const {
124  std::string result;
125  if ((mask_ & kHwDiv) != 0) {
126    result += "div";
127  }
128  if (result.size() == 0) {
129    result = "none";
130  }
131  return result;
132}
133
134}  // namespace art
135