kInstrCanThrow,
kInstrCanContinue|kInstrCanThrow,
kInstrCanContinue|kInstrCanThrow,
- kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
+ kInstrCanContinue,
kInstrCanReturn,
kInstrCanContinue|kInstrCanThrow,
kInstrCanContinue|kInstrCanThrow,
# switch -- is a switch
# throw -- might throw an exception
# return -- is a return from method
-# invoke -- is a method invoke
+# invoke -- is a method invoke; this is only used for true
+# method invokes and notably *not* vm-implemented
+# execute-inline nor the nop-equivalent
+# invoke-direct-empty
# Regular opcodes (with a couple holes)
op 00 nop 10x n none continue
op ed ^throw-verification-error 20bc n varies optimized|throw
op ee +execute-inline 35mi n inline-method optimized|continue|throw
op ef +execute-inline/range 3rmi n inline-method optimized|continue|throw
-op f0 +invoke-direct-empty 35c n method-ref optimized|continue|throw|invoke
+op f0 +invoke-direct-empty 35c n method-ref optimized|continue
op f1 +return-void-barrier 10x n none optimized|return
op f2 +iget-quick 22cs y field-offset optimized|continue|throw
op f3 +iget-wide-quick 22cs y field-offset optimized|continue|throw
int flags = dexGetInstrFlags(dalvikInsn->opCode);
int dalvikOpCode = dalvikInsn->opCode;
- if ((flags & kInstrInvoke) &&
- (dalvikOpCode != OP_INVOKE_DIRECT_EMPTY)) {
+ if (flags & kInstrInvoke) {
attributes &= ~METHOD_IS_LEAF;
}
int flags = dexGetInstrFlags(insn->dalvikInsn.opCode);
- if ((flags & kInstrInvoke) &&
- (insn->dalvikInsn.opCode != OP_INVOKE_DIRECT_EMPTY)) {
+ if (flags & kInstrInvoke) {
assert(numInsts == 1);
CallsiteInfo *callsiteInfo =
dvmCompilerNew(sizeof(CallsiteInfo), true);
* currently only due to trace length constraint. In this case we need
* to generate an explicit branch at the end of the block to jump to
* the chaining cell.
- *
- * NOTE: INVOKE_DIRECT_EMPTY is actually not an invoke but a nop
*/
curBB->needFallThroughBranch =
((flags & (kInstrCanBranch | kInstrCanSwitch | kInstrCanReturn |
- kInstrInvoke)) == 0) ||
- (lastInsn->dalvikInsn.opCode == OP_INVOKE_DIRECT_EMPTY);
+ kInstrInvoke)) == 0);
/* Only form a loop if JIT_OPT_NO_LOOP is not set */
if (curBB->taken == NULL &&
if ((flags & kInstrInvoke) == 0)
continue;
- /* Not a real invoke - continue */
- if (opCode == OP_INVOKE_DIRECT_EMPTY)
- continue;
-
/*
* If the invoke itself is selected for single stepping, don't bother
* to inline it.
}
if (!dexIsGoto(flags) &&
- /* don't end trace on INVOKE_DIRECT_EMPTY */
- (decInsn.opCode != OP_INVOKE_DIRECT_EMPTY) &&
((flags & (kInstrCanBranch |
kInstrCanSwitch |
kInstrCanReturn |