summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/GenCommon.cc
diff options
context:
space:
mode:
author buzbee <buzbee@google.com> 2012-03-20 10:38:17 -0700
committer buzbee <buzbee@google.com> 2012-03-20 14:36:11 -0700
commit16da88c70c4bdbd97b8482be8b42103a52f22d59 (patch)
tree905c1bfc68c7a301706a5cd2b7a3d7d9084a06b3 /src/compiler/codegen/GenCommon.cc
parentb41b33b5e5f08083e35f84818b4f44d26feb4a8b (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.cc29
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);