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) WITH_DEBUGGER and WITH_PROFILER are no longer defined (but are
     assumed to be enabled)
(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 interpreter to co-exist the new switching model which
     elminiates a separate debug interpreter.  Needs a dedicated
     rIBASE register (or alternate switching model with variable
     handler base).
(hi) Add dvmReportXXXX()" calls in footer.cpp to support profilers &
     debuggers.
(hi) Set self->debugIsMethodEntry in invoke code.

(md) Add implementations for jumbo opcodes (40 instructions) and
     their volatile variants (13 instructions)
(md) Correct OP_MONITOR_EXIT (need to adjust PC before throw)
(md) OP_THROW needs to export the PC
(md) Use dvmThrowArrayIndexOutOfBoundsException(length, index) for
     array bounds errors.
(md) Use dvmThrowClassCastException(actual, desired) for class cast errors.
(md) Use dvmThrowArrayStoreExceptionIncompatibleElement(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_*_VOLATILE (12 instructions)
(lo) Implement OP_RETURN_VOID_BARRIER
(lo) Implement OP_INVOKE_OBJECT_INIT
(lo) Implement dvmJitScanAllClassPointers
