instruction_set.cc revision 0f45f22eb3c52f0ece4c56989180e79c6680d825
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