diff options
author | Bill Buzbee <buzbee@google.com> | 2010-02-03 16:02:36 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-02-03 16:02:36 -0800 |
commit | e7ce72b4e44c2ee29c790d0fb4eb8ef8633c891d (patch) | |
tree | 3c0f4376e194916b92fec6d1e235058d51f4d347 /vm/compiler/codegen/arm/Thumb2/Gen.c | |
parent | e664cc031abea29d3817834ce9746edbe191bcf5 (diff) | |
parent | f5ceaebfe5633a16b11a7073d2bf36b5bb0c9945 (diff) | |
download | android_dalvik-e7ce72b4e44c2ee29c790d0fb4eb8ef8633c891d.tar.gz android_dalvik-e7ce72b4e44c2ee29c790d0fb4eb8ef8633c891d.tar.bz2 android_dalvik-e7ce72b4e44c2ee29c790d0fb4eb8ef8633c891d.zip |
Merge "Jit: Rework monitor enter/exit to simplify thread suspension" into dalvik-dev
Diffstat (limited to 'vm/compiler/codegen/arm/Thumb2/Gen.c')
-rw-r--r-- | vm/compiler/codegen/arm/Thumb2/Gen.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/vm/compiler/codegen/arm/Thumb2/Gen.c b/vm/compiler/codegen/arm/Thumb2/Gen.c index 5f2a6a259..1f947c2ad 100644 --- a/vm/compiler/codegen/arm/Thumb2/Gen.c +++ b/vm/compiler/codegen/arm/Thumb2/Gen.c @@ -231,26 +231,30 @@ static void genMonitor(CompilationUnit *cUnit, MIR *mir) offsetof(Object, lock) >> 2); } // Note: end of IT block - branch = newLIR2(cUnit, kThumb2Cbz, r2, 0); + // Export PC (part 1) + loadConstant(cUnit, r3, (int) (cUnit->method->insns + mir->offset)); + if (enter) { - loadConstant(cUnit, r7, (int)dvmLockObject); + /* Get dPC of next insn */ + loadConstant(cUnit, r4PC, (int)(cUnit->method->insns + mir->offset + + dexGetInstrWidthAbs(gDvm.instrWidth, OP_MONITOR_ENTER))); + // Export PC (part 2) + newLIR3(cUnit, kThumb2StrRRI8Predec, r3, rFP, + sizeof(StackSaveArea) - + offsetof(StackSaveArea, xtra.currentPc)); + /* Call template, and don't return */ + genDispatchToHandler(cUnit, TEMPLATE_MONITOR_ENTER); } else { loadConstant(cUnit, r7, (int)dvmUnlockObject); + // Export PC (part 2) + newLIR3(cUnit, kThumb2StrRRI8Predec, r3, rFP, + sizeof(StackSaveArea) - + offsetof(StackSaveArea, xtra.currentPc)); + opReg(cUnit, kOpBlx, r7); + clobberCallRegs(cUnit); } - genExportPC(cUnit, mir); - opReg(cUnit, kOpBlx, r7); - /* - * Refresh Jit's on/off status, which may have changed if we were - * sent to VM_MONITOR state above. - * TUNING: pointer chase, but must refresh following return from call - */ - loadWordDisp(cUnit, rGLUE, offsetof(InterpState, ppJitProfTable), r0); - loadWordDisp(cUnit, r0, 0, r0); - storeWordDisp(cUnit, rGLUE, offsetof(InterpState, pJitProfTable), r0); - - clobberCallRegs(cUnit); // Resume here target = newLIR0(cUnit, kArmPseudoTargetLabel); |