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