diff options
author | Ian Rogers <irogers@google.com> | 2014-11-05 23:46:43 -0800 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-11-13 16:17:46 -0800 |
commit | d582fa4ea62083a7598dded5b82dc2198b3daac7 (patch) | |
tree | c76704c266ef4687eab425612ddf3fd24f93fe8d /runtime/arch/instruction_set.cc | |
parent | f20076ff813b8012096ff31af236d59db3c0f4e1 (diff) | |
download | art-d582fa4ea62083a7598dded5b82dc2198b3daac7.zip art-d582fa4ea62083a7598dded5b82dc2198b3daac7.tar.gz art-d582fa4ea62083a7598dded5b82dc2198b3daac7.tar.bz2 |
Instruction set features for ARM64, MIPS and X86.
Also, refactor how feature strings are handled so they are additive or
subtractive.
Make MIPS have features for FPU 32-bit and MIPS v2. Use in the quick compiler
rather than #ifdefs that wouldn't have worked in cross-compilation.
Add SIMD features for x86/x86-64 proposed in:
https://android-review.googlesource.com/#/c/112370/
Bug: 18056890
Change-Id: Ic88ff84a714926bd277beb74a430c5c7d5ed7666
Diffstat (limited to 'runtime/arch/instruction_set.cc')
-rw-r--r-- | runtime/arch/instruction_set.cc | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/runtime/arch/instruction_set.cc b/runtime/arch/instruction_set.cc new file mode 100644 index 0000000..92fa727 --- /dev/null +++ b/runtime/arch/instruction_set.cc @@ -0,0 +1,125 @@ +/* + * 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" + +#include "globals.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 kMips64: + return "mips64"; + case kNone: + return "none"; + default: + LOG(FATAL) << "Unknown ISA " << isa; + UNREACHABLE(); + } +} + +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; + } else if (strcmp("mips64", 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."; + UNREACHABLE(); + default: + LOG(FATAL) << "Unknown ISA " << isa; + UNREACHABLE(); + } +} + +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"; + UNREACHABLE(); + + default: + LOG(FATAL) << "Unknown instruction set" << isa; + UNREACHABLE(); + } +} + +} // namespace art |