132 lines
3.2 KiB
C++
132 lines
3.2 KiB
C++
/*
|
|
* 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) == 0) {
|
|
return kArm;
|
|
} else if (strcmp("arm64", isa_str) == 0) {
|
|
return kArm64;
|
|
} else if (strcmp("x86", isa_str) == 0) {
|
|
return kX86;
|
|
} else if (strcmp("x86_64", isa_str) == 0) {
|
|
return kX86_64;
|
|
} else if (strcmp("mips", isa_str) == 0) {
|
|
return kMips;
|
|
}
|
|
|
|
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;
|
|
|
|
static constexpr size_t kArmStackOverflowReservedBytes = 8 * KB;
|
|
static constexpr size_t kArm64StackOverflowReservedBytes = 8 * KB;
|
|
static constexpr size_t kX86StackOverflowReservedBytes = 8 * KB;
|
|
static constexpr size_t kX86_64StackOverflowReservedBytes = 8 * 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
|