Items requiring attention:

(hi) Add gc card marking to aput/iput/sput/new_filled_array
(hi) Correct stack overflow handling (dvmCleanupStackOverflow takes an
     additional argument now)
(hi) "debugger active" test in common_periodicChecks must handle
     the case where glue->pDebuggerActive is a NULL pointer (used to
     skip a memory load when debugger support is completely disabled)
(hi) WITH_DEBUGGER and WITH_PROFILER are no longer defined (but are
     assumed to be enabled)
(hi) Add implementations for jumbo opcodes (40 instructions)
(hi) Implement OP_DISPATCH_FF for real. (Right now it's treated as
     an unused instruction.)
(hi) Rename dvmJitGetCodeAddr to dvmJitGetTraceAddr.
(hi) Remove references to rGLUE and replace with rSELF
(hi) Rework footer.s's suspend check to reflect suspendCount change
(hi) Rework interpreter to co-exist the new switching model which
     elminiates a separate debug interpreter.

(md) Correct OP_MONITOR_EXIT (need to adjust PC before throw)
(md) OP_THROW needs to export the PC
(md) Use dvmThrowArrayIndexOutOfBoundsException(index, length) for
     array bounds errors.
(md) Use dvmThrowClassCastException(actual, desired) for class cast errors.
(md) Use dvmThrowArrayStoreException(actual, desired) for array store errors.
(md) Use dvmThrowNegativeArraySizeException(len) forarray alloc errors
(md) Replace any remaining use of dvmThrowException with proper helper function

(lo) Implement OP_BREAKPOINT
(lo) Implement OP_EXECUTE_INLINE_RANGE
(lo) Implement OP_*_VOLATILE (12 instructions)
(lo) Implement OP_RETURN_VOID_BARRIER
(lo) Implement OP_INVOKE_OBJECT_INIT
