aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/arm/Thumb2/Factory.cpp
diff options
context:
space:
mode:
authorAnders O Nilsson <anders.o.nilsson@stericsson.com>2012-12-18 09:31:44 +0100
committerSteve Kondik <shade@chemlab.org>2013-07-24 12:59:42 -0700
commita9ecd84e5f5423a1ba6bbb2bb9256b0dc382de44 (patch)
treebc7770441f6db096e8f9d00d064282dedab84773 /vm/compiler/codegen/arm/Thumb2/Factory.cpp
parent96d80eebbb1ba0c8a7b195514e82ac1118a88eb6 (diff)
JIT: Combine add with shift and offset for array load & store.
Optimize long and double array load / store for ARM JIT. Array load / store performs a logical shift left and add, replace it with add capable of performing shift in the same instruction. Array load / store performs an add instead of using offset for vldr/vstr. Replace the add and vldr/vstr with a vldr/vstr that is capable of handling offset. This improves performance for usecases involving long and double array code execution in Dalvik. E.g WindowOrientation. Change-Id: I90220c349ab936cdba1987139ccdf4dc31d7bbb0 Signed-off-by: Patrik Ryd <patrik.ryd@stericsson.com>
Diffstat (limited to 'vm/compiler/codegen/arm/Thumb2/Factory.cpp')
-rw-r--r--vm/compiler/codegen/arm/Thumb2/Factory.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/vm/compiler/codegen/arm/Thumb2/Factory.cpp b/vm/compiler/codegen/arm/Thumb2/Factory.cpp
index b9265e823..e062369c7 100644
--- a/vm/compiler/codegen/arm/Thumb2/Factory.cpp
+++ b/vm/compiler/codegen/arm/Thumb2/Factory.cpp
@@ -1153,11 +1153,21 @@ static void storePair(CompilationUnit *cUnit, int base, int lowReg, int highReg)
storeBaseDispWide(cUnit, base, 0, lowReg, highReg);
}
+static void storePair(CompilationUnit *cUnit, int base, int displacement, int lowReg, int highReg)
+{
+ storeBaseDispWide(cUnit, base, displacement, lowReg, highReg);
+}
+
static void loadPair(CompilationUnit *cUnit, int base, int lowReg, int highReg)
{
loadBaseDispWide(cUnit, NULL, base, 0, lowReg, highReg, INVALID_SREG);
}
+static void loadPair(CompilationUnit *cUnit, int base, int displacement, int lowReg, int highReg)
+{
+ loadBaseDispWide(cUnit, NULL, base, displacement, lowReg, highReg, INVALID_SREG);
+}
+
/*
* Generate a register comparison to an immediate and branch. Caller
* is responsible for setting branch target field.