| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "instruction_set.h" |
| |
| namespace art { |
| |
| const char* GetInstructionSetString(const InstructionSet isa) { |
| switch (isa) { |
| case kArm: |
| case kThumb2: |
| return "arm"; |
| case kArm64: |
| return "arm64"; |
| case kX86: |
| return "x86"; |
| case kX86_64: |
| return "x86_64"; |
| case kMips: |
| return "mips"; |
| case kNone: |
| return "none"; |
| default: |
| LOG(FATAL) << "Unknown ISA " << isa; |
| return nullptr; |
| } |
| } |
| |
| InstructionSet GetInstructionSetFromString(const char* isa_str) { |
| CHECK(isa_str != nullptr); |
| |
| if (!strcmp("arm", isa_str)) { |
| return kArm; |
| } else if (!strcmp("arm64", isa_str)) { |
| return kArm64; |
| } else if (!strcmp("x86", isa_str)) { |
| return kX86; |
| } else if (!strcmp("x86_64", isa_str)) { |
| return kX86_64; |
| } else if (!strcmp("mips", isa_str)) { |
| return kMips; |
| } else if (!strcmp("none", isa_str)) { |
| return kNone; |
| } |
| |
| LOG(FATAL) << "Unknown ISA " << isa_str; |
| return kNone; |
| } |
| |
| size_t GetInstructionSetAlignment(InstructionSet isa) { |
| switch (isa) { |
| case kArm: |
| // Fall-through. |
| case kThumb2: |
| return kArmAlignment; |
| case kArm64: |
| return kArm64Alignment; |
| case kX86: |
| // Fall-through. |
| case kX86_64: |
| return kX86Alignment; |
| case kMips: |
| return kMipsAlignment; |
| case kNone: |
| LOG(FATAL) << "ISA kNone does not have alignment."; |
| return 0; |
| default: |
| LOG(FATAL) << "Unknown ISA " << isa; |
| return 0; |
| } |
| } |
| |
| |
| static constexpr size_t kDefaultStackOverflowReservedBytes = 16 * KB; |
| static constexpr size_t kMipsStackOverflowReservedBytes = kDefaultStackOverflowReservedBytes; |
| |
| // TODO: Lower once implicit stack-overflow checks can work with less than 16K. |
| static constexpr size_t kArmStackOverflowReservedBytes = (kIsDebugBuild ? 16 : 16) * KB; |
| static constexpr size_t kArm64StackOverflowReservedBytes = (kIsDebugBuild ? 16 : 16) * KB; |
| static constexpr size_t kX86StackOverflowReservedBytes = (kIsDebugBuild ? 16 : 16) * KB; |
| static constexpr size_t kX86_64StackOverflowReservedBytes = (kIsDebugBuild ? 16 : 16) * KB; |
| |
| size_t GetStackOverflowReservedBytes(InstructionSet isa) { |
| switch (isa) { |
| case kArm: // Intentional fall-through. |
| case kThumb2: |
| return kArmStackOverflowReservedBytes; |
| |
| case kArm64: |
| return kArm64StackOverflowReservedBytes; |
| |
| case kMips: |
| return kMipsStackOverflowReservedBytes; |
| |
| case kX86: |
| return kX86StackOverflowReservedBytes; |
| |
| case kX86_64: |
| return kX86_64StackOverflowReservedBytes; |
| |
| case kNone: |
| LOG(FATAL) << "kNone has no stack overflow size"; |
| return 0; |
| |
| default: |
| LOG(FATAL) << "Unknown instruction set" << isa; |
| return 0; |
| } |
| } |
| |
| std::string InstructionSetFeatures::GetFeatureString() const { |
| std::string result; |
| if ((mask_ & kHwDiv) != 0) { |
| result += "div"; |
| } |
| if (result.size() == 0) { |
| result = "none"; |
| } |
| return result; |
| } |
| |
| } // namespace art |