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;