diff options
| author | 2012-03-20 10:38:17 -0700 | |
|---|---|---|
| committer | 2012-03-20 14:36:11 -0700 | |
| commit | 16da88c70c4bdbd97b8482be8b42103a52f22d59 (patch) | |
| tree | 905c1bfc68c7a301706a5cd2b7a3d7d9084a06b3 /src/compiler/codegen/GenCommon.cc | |
| parent | b41b33b5e5f08083e35f84818b4f44d26feb4a8b (diff) | |
Custom codegen for small frameless methods.
Added a general mechanism that will allow pattern matching of
small methods and (generally) frameless code generation. Prevously,
all frames were at least 16 bytes, not you can have zero-length
frames (and thus some old asserts had to go).
Change-Id: Ic786940a602e25b48cbc317ac601ac84cc307762
Diffstat (limited to 'src/compiler/codegen/GenCommon.cc')
| -rw-r--r-- | src/compiler/codegen/GenCommon.cc | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc index c5b28b3faf..f63ad4c3ca 100644 --- a/src/compiler/codegen/GenCommon.cc +++ b/src/compiler/codegen/GenCommon.cc @@ -931,6 +931,17 @@ void oatSetupResourceMasks(LIR* lir) setupResourceMasks(lir); } +bool fastInstance(CompilationUnit* cUnit, uint32_t fieldIdx, + int& fieldOffset, bool& isVolatile, bool isPut) +{ + OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker, + *cUnit->dex_file, *cUnit->dex_cache, + cUnit->code_item, cUnit->method_idx, + cUnit->access_flags); + return cUnit->compiler->ComputeInstanceFieldInfo(fieldIdx, &mUnit, + fieldOffset, isVolatile, isPut); +} + void genIGet(CompilationUnit* cUnit, MIR* mir, OpSize size, RegLocation rlDest, RegLocation rlObj, bool isLongOrDouble, bool isObject) @@ -939,13 +950,8 @@ void genIGet(CompilationUnit* cUnit, MIR* mir, OpSize size, bool isVolatile; uint32_t fieldIdx = mir->dalvikInsn.vC; - OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker, - *cUnit->dex_file, *cUnit->dex_cache, - cUnit->code_item, cUnit->method_idx, - cUnit->access_flags); - - bool fastPath = cUnit->compiler->ComputeInstanceFieldInfo(fieldIdx, &mUnit, - fieldOffset, isVolatile, false); + bool fastPath = fastInstance(cUnit, fieldIdx, fieldOffset, isVolatile, + false); if (fastPath && !SLOW_FIELD_PATH) { RegLocation rlResult; @@ -1006,13 +1012,8 @@ void genIPut(CompilationUnit* cUnit, MIR* mir, OpSize size, RegLocation rlSrc, bool isVolatile; uint32_t fieldIdx = mir->dalvikInsn.vC; - OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker, - *cUnit->dex_file, *cUnit->dex_cache, - cUnit->code_item, cUnit->method_idx, - cUnit->access_flags); - - bool fastPath = cUnit->compiler->ComputeInstanceFieldInfo(fieldIdx, &mUnit, - fieldOffset, isVolatile, true); + bool fastPath = fastInstance(cUnit, fieldIdx, fieldOffset, isVolatile, + true); if (fastPath && !SLOW_FIELD_PATH) { RegisterClass regClass = oatRegClassBySize(size); DCHECK_GE(fieldOffset, 0); |