diff options
| author | Anders O Nilsson <anders.o.nilsson@stericsson.com> | 2012-12-18 09:31:44 +0100 |
|---|---|---|
| committer | Steve Kondik <shade@chemlab.org> | 2013-07-24 12:59:42 -0700 |
| commit | a9ecd84e5f5423a1ba6bbb2bb9256b0dc382de44 (patch) | |
| tree | bc7770441f6db096e8f9d00d064282dedab84773 /vm/compiler/codegen/arm/Thumb2/Factory.cpp | |
| parent | 96d80eebbb1ba0c8a7b195514e82ac1118a88eb6 (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.cpp | 10 |
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. |
