diff options
author | Zheng Xu <zheng.xu@arm.com> | 2014-06-03 16:22:23 +0800 |
---|---|---|
committer | Zheng Xu <zheng.xu@arm.com> | 2014-06-04 16:15:10 +0800 |
commit | 511c8a653d5896e81428393a1c3d427da64e36f3 (patch) | |
tree | 2d286df3b09a689a313bccd8925eb29fc2d1c4eb /runtime/stack.h | |
parent | 57795db7d44bcd6d106481fa192691400b2358c8 (diff) | |
download | art-511c8a653d5896e81428393a1c3d427da64e36f3.zip art-511c8a653d5896e81428393a1c3d427da64e36f3.tar.gz art-511c8a653d5896e81428393a1c3d427da64e36f3.tar.bz2 |
AArch64: Fix cmp-long and method with long arguments.
1. Fix cmp-long.
2. Use single register to pass long argument.
3. Flush StackReference<ArtMethod> on arm64 the same as in common code.
3. Fix the mismatch in calculate reg offset.
Change-Id: Ie2723260fb143512e4da6ee88d4f3aded80d3d5e
Diffstat (limited to 'runtime/stack.h')
-rw-r--r-- | runtime/stack.h | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/runtime/stack.h b/runtime/stack.h index fabdd4f..e1c8c80 100644 --- a/runtime/stack.h +++ b/runtime/stack.h @@ -599,37 +599,37 @@ class StackVisitor { * on location in frame as long as code generator itself knows how * to access them. * - * +------------------------+ - * | IN[ins-1] | {Note: resides in caller's frame} - * | . | - * | IN[0] | - * | caller's Method* | - * +========================+ {Note: start of callee's frame} - * | core callee-save spill | {variable sized} - * +------------------------+ - * | fp callee-save spill | - * +------------------------+ - * | filler word | {For compatibility, if V[locals-1] used as wide - * +------------------------+ - * | V[locals-1] | - * | V[locals-2] | - * | . | - * | . | ... (reg == 2) - * | V[1] | ... (reg == 1) - * | V[0] | ... (reg == 0) <---- "locals_start" - * +------------------------+ - * | Compiler temp region | ... (reg <= -3) - * | | - * | | - * +------------------------+ - * | stack alignment padding| {0 to (kStackAlignWords-1) of padding} - * +------------------------+ - * | OUT[outs-1] | - * | OUT[outs-2] | - * | . | - * | OUT[0] | - * | curMethod* | ... (reg == -2) <<== sp, 16-byte aligned - * +========================+ + * +---------------------------+ + * | IN[ins-1] | {Note: resides in caller's frame} + * | . | + * | IN[0] | + * | caller's ArtMethod | ... StackReference<ArtMethod> + * +===========================+ {Note: start of callee's frame} + * | core callee-save spill | {variable sized} + * +---------------------------+ + * | fp callee-save spill | + * +---------------------------+ + * | filler word | {For compatibility, if V[locals-1] used as wide + * +---------------------------+ + * | V[locals-1] | + * | V[locals-2] | + * | . | + * | . | ... (reg == 2) + * | V[1] | ... (reg == 1) + * | V[0] | ... (reg == 0) <---- "locals_start" + * +---------------------------+ + * | Compiler temp region | ... (reg <= -3) + * | | + * | | + * +---------------------------+ + * | stack alignment padding | {0 to (kStackAlignWords-1) of padding} + * +---------------------------+ + * | OUT[outs-1] | + * | OUT[outs-2] | + * | . | + * | OUT[0] | + * | StackReference<ArtMethod> | ... (reg == -2) <<== sp, 16-byte aligned + * +===========================+ */ static int GetVRegOffset(const DexFile::CodeItem* code_item, uint32_t core_spills, uint32_t fp_spills, @@ -661,7 +661,7 @@ class StackVisitor { return locals_start + (reg * sizeof(uint32_t)); } else { // Handle ins. - return frame_size + ((reg - num_regs) * sizeof(uint32_t)) + GetBytesPerGprSpillLocation(isa); + return frame_size + ((reg - num_regs) * sizeof(uint32_t)) + sizeof(StackReference<mirror::ArtMethod>); } } |