Add execute-inline/range instruction.
Like "execute-inline", this is an instruction generated by dexopt that
replaces a method invoke instruction. It's useful for small, frequently
called methods in the core libs.
As with execute-inline, we allow at most 4 arguments, but with /range
we're no longer limited to the low 16 registers.
Also: marked execute-inline as being able to throw an exception.
Needed: native x86 implementation; support in JIT.
For bug 2268232.
diff --git a/vm/compiler/Dataflow.c b/vm/compiler/Dataflow.c
index fc5ecb9..d520d84 100644
--- a/vm/compiler/Dataflow.c
+++ b/vm/compiler/Dataflow.c
@@ -746,7 +746,7 @@
// EE OP_EXECUTE_INLINE
DF_FORMAT_35C,
- // EF OP_UNUSED_EF
+ // EF OP_EXECUTE_INLINE_RANGE
DF_NOP,
// F0 OP_INVOKE_DIRECT_EMPTY
diff --git a/vm/compiler/codegen/arm/Codegen.c b/vm/compiler/codegen/arm/Codegen.c
index 7ca905c..370c857 100644
--- a/vm/compiler/codegen/arm/Codegen.c
+++ b/vm/compiler/codegen/arm/Codegen.c
@@ -4005,6 +4005,13 @@
return false;
}
+static bool handleFmt3rinline(CompilationUnit *cUnit, MIR *mir)
+{
+ /* For OP_EXECUTE_INLINE_RANGE */
+ genInterpSingleStep(cUnit, mir);
+ return false;
+}
+
static bool handleFmt51l(CompilationUnit *cUnit, MIR *mir)
{
//TUNING: We're using core regs here - not optimal when target is a double
@@ -4581,6 +4588,9 @@
case kFmt3inline:
notHandled = handleFmt3inline(cUnit, mir);
break;
+ case kFmt3rinline:
+ notHandled = handleFmt3rinline(cUnit, mir);
+ break;
case kFmt51l:
notHandled = handleFmt51l(cUnit, mir);
break;