From d72564ca7aa66c6d95b6ca34299258b65ecfd1cb Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Tue, 8 Feb 2011 17:09:25 -0800 Subject: Misc goodies in the JIT in preparation for more aggressive code motion. - Set up resource masks correctly for Thumb push/pop when LR/PC are involved. - Preserve LR around simulated heap references under self-verification mode. - Compact a few simple flags in ArmLIR into bit fields. - Minor performance tuning in TEMPLATE_MEM_OP_DECODE Change-Id: Id73edac837c5bb37dfd21f372d6fa21c238cf42a --- vm/compiler/codegen/arm/CodegenCommon.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'vm/compiler/codegen/arm/CodegenCommon.c') diff --git a/vm/compiler/codegen/arm/CodegenCommon.c b/vm/compiler/codegen/arm/CodegenCommon.c index c29efa640..f4ca95c4a 100644 --- a/vm/compiler/codegen/arm/CodegenCommon.c +++ b/vm/compiler/codegen/arm/CodegenCommon.c @@ -84,9 +84,9 @@ static void annotateDalvikRegAccess(ArmLIR *lir, int regId, bool isLoad) } /* - * Decode the register id and mark the corresponding bit(s). + * Decode the register id. */ -static inline void setupRegMask(u8 *mask, int reg) +static inline u8 getRegMaskCommon(int reg) { u8 seed; int shift; @@ -100,7 +100,21 @@ static inline void setupRegMask(u8 *mask, int reg) shift = FPREG(reg) ? kFPReg0 : 0; /* Expand the double register id into single offset */ shift += regId; - *mask |= seed << shift; + return (seed << shift); +} + +/* External version of getRegMaskCommon */ +u8 dvmGetRegResourceMask(int reg) +{ + return getRegMaskCommon(reg); +} + +/* + * Mark the corresponding bit(s). + */ +static inline void setupRegMask(u8 *mask, int reg) +{ + *mask |= getRegMaskCommon(reg); } /* @@ -196,6 +210,18 @@ static void setupResourceMasks(ArmLIR *lir) if (flags & USES_CCODES) { lir->useMask |= ENCODE_CCODE; } + + /* Fixup for kThumbPush/lr and kThumbPop/pc */ + if (opcode == kThumbPush || opcode == kThumbPop) { + u8 r8Mask = getRegMaskCommon(r8); + if ((opcode == kThumbPush) && (lir->useMask & r8Mask)) { + lir->useMask &= ~r8Mask; + lir->useMask |= ENCODE_REG_LR; + } else if ((opcode == kThumbPop) && (lir->defMask & r8Mask)) { + lir->defMask &= ~r8Mask; + lir->defMask |= ENCODE_REG_PC; + } + } } /* -- cgit v1.2.3