summaryrefslogtreecommitdiffstats
path: root/runtime/utils.cc
diff options
context:
space:
mode:
authorDave Allison <dallison@google.com>2013-10-22 17:52:19 -0700
committerDave Allison <dallison@google.com>2013-11-05 16:48:53 -0800
commit7020278bce98a0735dc6abcbd33bdf1ed2634f1d (patch)
tree533cf9a77046a49525d916043a58949e59319f2d /runtime/utils.cc
parent67f128a4023bbbe55827dd2c11ed0538ee387233 (diff)
downloadart-7020278bce98a0735dc6abcbd33bdf1ed2634f1d.tar.gz
art-7020278bce98a0735dc6abcbd33bdf1ed2634f1d.tar.bz2
art-7020278bce98a0735dc6abcbd33bdf1ed2634f1d.zip
Support hardware divide instruction
Bug: 11299025 Uses sdiv for division and a combo of sdiv, mul and sub for modulus. Only does this on processors that are capable of the sdiv instruction, as determined by the build system. Also provides a command line arg --instruction-set-features= to allow cross compilation. Makefile adds the --instruction-set-features= arg to build-time dex2oat runs and defaults it to something obtained from the target architecture. Provides a GetInstructionSetFeatures() function on CompilerDriver that can be queried for various features. The only feature supported right now is hasDivideInstruction(). Also adds a few more instructions to the ARM disassembler b/11535253 is an addition to this CL to be done later. Change-Id: Ia8aaf801fd94bc71e476902749cf20f74eba9f68
Diffstat (limited to 'runtime/utils.cc')
-rw-r--r--runtime/utils.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/runtime/utils.cc b/runtime/utils.cc
index 9796b9963..e039581b0 100644
--- a/runtime/utils.cc
+++ b/runtime/utils.cc
@@ -889,6 +889,35 @@ void Split(const std::string& s, char separator, std::vector<std::string>& resul
}
}
+std::string Trim(std::string s) {
+ std::string result;
+ unsigned int start_index = 0;
+ unsigned int end_index = s.size() - 1;
+
+ // Skip initial whitespace.
+ while (start_index < s.size()) {
+ if (!isspace(s[start_index])) {
+ break;
+ }
+ start_index++;
+ }
+
+ // Skip terminating whitespace.
+ while (end_index >= start_index) {
+ if (!isspace(s[end_index])) {
+ break;
+ }
+ end_index--;
+ }
+
+ // All spaces, no beef.
+ if (end_index < start_index) {
+ return "";
+ }
+ // Start_index is the first non-space, end_index is the last one.
+ return s.substr(start_index, end_index - start_index + 1);
+}
+
template <typename StringT>
std::string Join(std::vector<StringT>& strings, char separator) {
if (strings.empty()) {