Todo
  - JDK 1.2 $B$G$NF0:n%F%9%H!#(B
    CaffeineMark, Swing$B!#(B
  - JDK 1.1.7 $B$G$N%F%9%H!#(B
    $B%/%i%9=i4|2=$N%?%$%_%s%0$rJQ99$7$?$?$a!#(B
  - adaptive compilation
    invocation counter $B$r8+$F%3%s%Q%$%k$r7hDj$9$k!#(B
  - $B%a%=%C%I8F$S=P$7$N%Y%s%A%^!<%/!#(B
    inovkeJITCompiledMethod() $B$K$F!"8F$S=P$785$,%$%s%?%W%j%?$+H]$+$NH=DjK!$r(B
    $BJQ$($?$?$a!#(B
  - JVM profiler interface $B$KBP1~!#(B
    #ifdef HPROF
    if (jvmpi_event_flags & JVMPI_EVENT_METHOD_ENTRY_ON) {
	jvmpi_method_entry(ee, o);
    }
    #endif /* HPROF */
  - JNI, native methods $B$NF0:n3NG'!#(B
  - $B4X?tL>$N%7%s%\%kF,$K(B `_' $B$,IU$/$+IU$+$J$$$+!"$D$^$j(B ELF $B$+(B a.out $B$+$r!"(B
    configure $B$GH=Dj!#(B
  - $B%3%s%Q%$%kCf$N%a%=%C%I$,8F$P$l$?>l9g$NBP:v(B
    $B%$%s%?%W%j%?$G<B9T$5$l!"(B_quick $B$X$NJQ49$,5/$3$j!"(Bpctable $B$H?)$$0c$&!#(B
  - SIGNAL_ERROR* $B$KEO$9(B STATE $B$,$*$=$i$/E,@Z$G$O$J$$!#D>$9!#(B
  - sysMalloc(), sysRealloc() $B$NNc30=hM}!#(B
  - SunOS 5, Win32 $B$K0\?"!#(B
  - SignalError() $B$NBh(B 3$B0z?t$H$7$FJ8;zNs$rEO$7$F$$$k$b$N$r%A%'%C%/!#(B
  - JMP $BL?Na$N!"(BE9 ($B0z?t(B 4 $B%P%$%H(B) $B$+$i(B EB ($B0z?t(B 1 $B%P%$%H(B) $B$X$N=q$-49$((B
  - UseLosslessQuickOpcodes = FALSE $B$G$h$$$h$&$K$9$k!#(B
      invokevirtual{,object}_quick $B$GL5M}$,$"$k!#(B
      $B%$%s%?%W%j%?$K<B9T$5$;$?>l9g$K!"(Boptop $B$,JV$jCM$NJ,A}$d$5$l$J$$(B
      $B$"$i$+$8$a(B methodblock $B$r<hF@$9$kI,MW$,$"$k$,!"$=$l$,$G$-$J$$!#(B

$BD4::(B
  - invokeignored_quick $B$X$N=q$-49$(5,B'!#(B

$B:GE,2=(B
  - invokeMethod() (runtime.c) $BCf$N=hM}$r(B native code (code.c) $B$K0\$9!#(B
    - if (access & ACC_STATIC) obj = (JHandle *)(cbHnadle(method->fb.clazz));
    - cur_frame->lastpc = ...
    - stackpointer += (args_size - 1);
  - $B%9%?%C%/>e$NMWAG$N@-<A(B ($BNc(B: $BG[Ns$N%5%$%:(B) $B$r(B trace $B$7!"(B
    $B>J$1$k3F<o%A%'%C%/(B ($BNc(B: $BE:;z$NHO0O(B) $B$r>J$/!#2>A[%9%?%C%/%i%$%V%i%j$rMQ0U!#(B
  - stack $B>e$NG\@:EYIbF0>.?tE@?t$r(B 8$B%P%$%H6-3&$K(B align $B$9$k!#(B
  - VolanoMark $B$r;n$9!#(B
  - CM3 $B$KBP$9$k(B compiled code $B$r8+$k!#(B
  - $B%/%m%C%/?t$r7WB,!#(B
  - invoke{,Synchronized}JavaMethod() $B$N8F$S=P$72s?t$r8:$i$9!#(B
      JavaFrame $B$r(B C $B$N%9%?%C%/>e$K3NJ]$9$k!#(B
      $B>c32(B:
        JavaFrame $B$N%a%s%P(B ostack $B$H(B optop $B$,F1$8NN0h$K$"$k$3$H$r(B
        $B2>Dj$7$?%3!<%I$,$"$k!#(B
        JavaFrame $B$NB8:_$r2>Dj$7$?%3!<%I$,B?$$!#(B
  - Object#<init> $B$N8F$S=P$7$r:o=|$9$k!#(B
      invokeignored_quick $B$X$N(B recode $B>r7o$rD4$Y$k!#(B
  - $BIbF0>.?tE@?t$r(B FPU $B$N%l%8%9%?$K:\$;$?$^$^$K$7$F$*$/!#(B
    JVM $B$N%l%8%9%?$K:\$;$J$$!#(B
  - bytecode $B$N@EE*:GE,2=!#(B
      invokeignored_quick $B$X$NJQ49!#(B
      [ifa]store{,_N}, [ifa]load{,_N} $B$G!"%a%b%j$+$i$NFI$_$@$7$r>J$/!#(B
  - lcmp, ifXX $B$H$$$C$?DjHV%3!<%INs$K$D$$$F:GE,2=!#(B
  - invoke(Synchronized)JavaMethod() $B$NBeBX$rMQ0U!"=hM}$r7Z8:$9$k!#(B
    $BGSB>@)8f$,I,MW!#(B-> thread library $B$r;H$C$F$7$^$&!#(B
  - native $BL?NaNs$N=q$-49$(!#(B
      invoke -> invokevirtual*object* $BAjEv$J$I!#(B
        obj_array_methodtable() $B$G$O$J$/(B obj_methodtable() $B$,;H$($k!#(B
  - JavaFrame $B$N:n@.$r>J$/!#(B
  - vars[0..] $B$r%l%8%9%?$K$N$;$F%-%c%C%7%e$9$k!#(B
  - lookupswitch $BL?Na$N8!:w%"%k%4%j%:%`$r2~NI$9$k!#(B
  - Address Generation Interlock(AGI) (MMX $BK\(B pp.95,99) $B$rHr$1$k!#(B
  - $B%8%c%s%W@h$r(B 8$B%P%$%H6-3&$K(B align$B!#(B
  - invokeignored_quick $B$K$F!"%9%?%C%/$N%-%c%C%7%eFbMF$rL5BL$K(B push $B$7$F$$$k!#(B

Idea
  - JVM $B$N5sF0$rJQ99$9$k<jCJ$H$7$F$N(B JIT compiler$B!#(B
    javac $B$N!"%U%C%/$r$+$1$i$l$k2U=j$rC5$9!#(B-> Jikes $B$r2~B$!)(B

Done
  - JDK 1.1 $B$G$b(B static initializer $B$,8F$P$l$k%?%$%_%s%0$r(B JLS $BDL$j$K$9$k!#(B
    Matt Welsh wrote:
    ResolveClassConstant2() with a last argument of 0 (all other arguments the
    same as ResolveClassConstant()) will resolve the class without
    initializing it. Then you can call InitClassConstantClass(cp_item_type *cp,
    unsigned index, struct execenv *ee) to run the initializer later.
  - $B%/%i%9$r=i4|2=$9$k%?%$%_%s%0$r(B
    JLS 12.4.1 (When Initialization Occurs) $B$NDL$j$K$9$k!#(Bfirst active use$B!#(B
    JDK 1.2 $B$N>l9g$N$_2r7h!#(B
  - CompilerContext $B$r$`$d$_$K(B free(), malloc() $B$7$J$$!#(B
  - $B%3%s%Q%$%k7k2L$r:FMxMQ$G$-$k$h$&$K$9$k!#%*%W%7%g%s(B codedb$B!#(B
  - signal $B$rMxMQ$7$F(B null check $B$r>J$/!#(B
  - class initializer $B$r%3%s%Q%$%k$7$J$$!#(B
  - java.lang.Compiler#enable(),disable() $B$,F/$/$h$&$K$9$k!#(B
    Swing 1.1 $B$N(B SwingSet $B$G%F%9%H!#(Bappleviewer SwingSetApplet.html
  - __{mul,div,mod}di3 $B$r8F$S=P$5$J$$$h$&$K$9$k!#(B
    64bit $B@0?t$N>h;;!"(B__muldi3 $B$O<+A0$N%3!<%I$rMQ0U$7$?!#(B
    $B=|!">jM>;;$O(B inline $B$G@8@.$9$k$H%3!<%I%5%$%:$,Bg$-$/$J$C$F$7$^$&!#(B
  - compiled code $B$N%5%$%:$NI=$r:n@.!"I=<((B
    CODESIZE_DEBUG
  - invokeignored_quick $B$G(B pc[2] == 0 $B$N>l9g!"(Bnull check $B%3!<%I$r>J$/!#(B
  - x86 $B$N(B CMOVcc ($B$*$h$S(B FCMOVcc) $B$NE,MQ$r8!F$$9$k!#(B
    w/ MMX $B$G$J$$(B Pentium $B0JA0$O(B {,F}CMOVcc $B$r;}$?$J$$!#(B
  - restack $B$r>J$/!#(Bnative method $B$N8F$S=P$7;~$O>J$1$J$$!#(B
  - native $BL?NaNs$N=q$-49$(!#(B
    new -> new_quick
  - boudary check, null check $B$J$I$N=t%A%'%C%/$r>J$$$?HG$b(B
    $B%3%s%Q%$%k$G$-$k$h$&$K$9$k!#(B
  - $B%8%c%s%WA0$N(B state $B$+$i%8%c%s%W8e$N(B state $B$X0\9T%3!<%I$,I,MW!#(B
    tableswitch, lookupswitch $B$O%H%i%s%]%j%sJ}<0$G2r7h!#(B

$B0\?";~$NCm0U(B
  - self modify $B;~$N(B offset
    new, invokestatic, {get,put}static{,2}
  - $B4X?tL>%7%s%\%k$,(B funcname $B$+(B _funcname $B$+!#(B
    gentable.rb $B$N5sF0$rJQ$($k!#(B
  - dynamic link $B4X78(B
    - Linux $B$N$h$&$K!"(Bdlopen(..., RTLD_LAZY) $B$J%i%$%V%i%jCf$N(B
      $B4X?t$N%"%I%l%9$r4X?t<B9TA0$KF@$i$l$k$+!"(BFreeBSD $B$N$h$&$KF@$i$l$J$$$+!#(B
        ^- $B$3$N@-<A$K0MB8$7$J$$%3!<%I$K$7$?!#(B
    - dlopen() $B$G%m!<%I$7$?%i%$%V%i%jCf$N4X?t$N%3!<%I$r=q$-49$($i$l$k$+!#(B
      Linux (libc5) $B$G$N$_2DG=!#(B
    - Linux $B$N(B JDK $B$N$h$&$K!"(Blibc $BCf$N4X?t$N%"%I%l%9$r(B sysDynamicLink() $B$G(B
      $BF@$i$l$k$+!"(BFreeBSD $B$N(B JDK $B$N$h$&$KF@$i$l$J$$$+!#(B
  - signal $B4X78(B
    - signal handler $B$N0z?t$H$7$F(B struct sigcontext $B$rF@$i$l$k$+!)(B
      $BNc(B: JDK for Linux $B$G$OF@$i$l$J$$!#(B
    - signal handler $B$,8F$P$l$?:]!"$=$N(B signal $B$KBP1~$9$k(B handler $B$,(B
      $B%j%;%C%H$5$l$k(B (FreeBSD) $B$+H]$+!#%j%;%C%H$5$l$k$J$iMW:F@_Dj!#(B
    - signal handler $B<B9TCf!"$=$N(B signal $B$,(B
      block $B$5$l$F$$$k(B (FreeBSD) $B$+H]$+!#(B
      $B$5$l$F$$$k$J$i(B handler $B$+$i$N%8%c%s%W;~$KMW(B unblock (sigprocmask(2))$B!#(B

$BCm5-(B
  - stack $B>e$NMWAG$,<B9T4D6-0MB8$K$J$k!#(B
    jsr, ret $BL?Na(B
  - JVM $B$H(B X86 $B$G%9%?%C%/$N@.D9J}8~$,5U!#(B
    64bit (long,double) $B$NCM$N(B 32bit x 2 $B$X$NJ,3dJ}K!$O(B
    JVM $B$N;EMM$H$7$F$OL$Dj5A(B(!)$B!#(B

JVM, JIT compiler $B$N%F%9%H(B
  - JDK $B$N(B regression test: javasrc/test/
  - Kaffe $B$N$b$N(B
  - Mauve $B%W%m%8%'%/%H(B

known bugs
  - $B2?$+$NM}M3$G%a%=%C%I$N%3%s%Q%$%k$,<:GT$7$?:]!"(B
  - final $B%U%#!<%k%I$X$N(B putfield, putstatic $B$G(B
    IllegalAccessError $B$,H/@8$7$J$$!#(B
    $BK\Mh$O(B bytecode verifier $B$,$O$M$k$Y$-!)(B
  - 1.1.X $B$G$O!"%/%i%9=i4|2=$N%?%$%_%s%0$,(B JLS 12.4.1 $B$H0c$&!#(B
    $B%/%i%9(B first active use $B;~$G$O$J$/!"(B
    first active use $B$9$k%a%=%C%I$N%3%s%Q%$%k;~$H$J$C$F$7$^$C$F$$$k!#(B
  - $BL58B%k!<%W<B9TCf$N%9%l%C%I$,!"(B
    $BB>%9%l%C%I$+$i(B Thread#stop() $B$7$F$b<B9TDd;_$7$J$$!#(B
    (genunix/java/green_threads/src/threads_md.c:
     sysThreadPostException() $B$b8z$+$J$$!#(B)
    $BB>$N(B JIT (Win32, Sol2) with Green Threads $B$G$O$I$&$+D4$Y$k!#(B
      TYA 1.0 $B$G$bF1$88=>]$,5/$-$k!#(B

TYA 1.0 $B$N(B bugs
  - $B>e5-(B known bugs$B!#(B:)
  - 5 $B<!850J>e$NG[Ns$r:n@.$9$k%3!<%I$r%3%s%Q%$%k$G$-$J$$!#(B

JDK 1.1.6, Version 2 (by Steve Byrne)
  - native method, sun.awt.motif.MChoicePeer#pReshape (IIII)V
    at sun/awt/motif/MChoicePeer#pReshape (IIII)V
    at sun/awt/motif/MComponentPeer#setBounds (IIII)V
    (javasrc/src/genunix/sun/awt_Choice.c l.348)
    $B$K$F%(%i!<%a%C%;!<%8(B
      Tried to free bogus memory XXXXXXX, ignored
    Motif or Xt $B$N%P%0!#(BJDK/README.linux $B$N(B Other issues $B$K5-=R$"$j!#(B
    JDK/demo/awt-1.1/symboltest/ $B$K$F!"(Bappletviewer index.html $B$G%F%9%H!#(B

$B5lHG(B ($BL$8x3+(B) $B$N(B bugs
  - exception_handler $B$K$F!"%9%?%C%/$r%/%j%"$7$?8e!"(B
    $BNc30%*%V%8%'%/%H$r(B push $B$7$F$$$J$$(B
  - secondPass() $B$K$F(B goto_w $B$G(B offset $B$r(B 2$B%P%$%H$G2r<a$7$F$$$k!#(B
  - compileOpcode in compile.c $B$K$F!"(B
    invokevirtual{,object}_quick $B$NDj?t2r7h$,B-$j$J$$!#(B
    <- UseLosslessQuickOpcodes = FALSE $B$J$N$G!"<j$r$D$1$h$&$,$J$$!#(B
  - showObjectBody() in runtime.c $B$,!"(Bnull object $B$KBP1~$7$F$$$J$$!#(B

$B3F(B ($BFbIt(B) $BL?Na$G9T$o$l$F$$$k3F<o%A%'%C%/(B
  - iaload, laload, baload, caload, saload, iastore, bastore, castore, sastore
	null, boundary
  - aastore
	null, boundary, instanceof
  - getfield, getfield2, putfield, putfield2
	null
  - invokevirtual, invokespecial, invokeinterface
	null
  - new
	class access
  - newarray, anewarray
	negative array size
  - arraylength
	null
  - athrow
	null
  - monitorenter, monitorexit
	null
  - nonnull_quick
	null

$B3F<o%A%'%C%/$K4X78$9$kFbItL?Na$*$h$S%^%/%m(B in code.c
  array_check, AASTORE_TEST(), FIELD_ACC(),
  NEW_TEST(), NEWARRAY_TEST(), ARRAYLENGTH_TEST(),
  NULL_TEST()

null check
  OS $B$N:90[(B
    Linux 2.2, 2.1:	struct sigcontext
    Linux 2.0:		struct sigcontext_struct
    FreeBSD:		struct sigcontext
    $B%l%8%9%?$NJB$S$,(B Linux, FreeBSD $B$G0[$J$k!#(BLinux 2.0, 2.1, 2.2 $B$G$OF1$8!#(B
  null check (NULL_TEST*) $B$r4^$`L?Na(B
    NULL_TEST
      ARRAY_CHECK
        array_check
        lastore
      FIELD_ACC
        getfield
        getfield2
        PUTFIELD_ST24
          putfield
          PUTFIELD2_ST24
          putfield2
      TGTOBJ_VIRTUAL
        invokevirtual
        TGTOBJ_SPECIAL
          invokespecial
        TGTOBJ_INTERFACE
          invokeinterface
      arraylength
      ATHROW
        athrow
      MONITOR
        monitorenter
        monitorexit
      nonnull_quick


$B<B9T4D6-CfN)$J<B9T%3%s%F%/%9%H$N<h$j=P$7(B
  code.c
    invoke* $B$K$F(B ee->current_frame->lastpc $B$r@_Dj!#(B


$B%"!<%-%F%/%A%c0MB8$N%3!<%I(B
  code.c
  code.h
    assembly code
    self rewrite $B$N$?$a$N%*%U%;%C%H(B (*_REWRITE_OFFSET)
  gentable.rb
    compiledCode() in code.c $BCf$NDj?tCj=P!"%*%U%;%C%H7W;;(B
  compile.c
    jump $BL?Na$N@8@.(B (in writeForAnOpcode())
  invoker.c
    $B%9%?%C%/$N@Q$_D>$7(B (JVM -> native)
  runtime.c
    $B%9%?%C%/$N@Q$_D>$7(B (native -> JVM)
$BHs0MB8$N%3!<%I(B
  compiler.[hc]
  computil.c


$B%G!<%?9=B$(B
  struct CatchFrame *cf = mb->exception_table;
    cf->compiled_CatchFrame = (void *)$B%*%U%;%C%H(B in native code;


$B%3%s%Q%$%k$N<j=g(B
  makePCTable()
    $BL?Na$NJ,2r(B
    method head, exc. handler, method tail $B$NIU2C(B
    processAnOpcode()
      $BBeBX(B opcode $B$r5a$a$k(B
      opcode, state, bytecode PC $B$rI=$KEPO?(B
      state, bytecode PC $B$r(B update
  writeCode()
    writeForAnOpcode()
      native code $B$r%P%C%U%!$K=q$/(B
      jump $BL?Na(B
	$B>uBVA+0\%3!<%I$rA^F~(B
	$BI=$KEPO?(B
      $BDj?t(B (static) $B$r2r7h(B
      native PC $B$r(B update
  resolveJumpInstructions()
    jump $BI=$r2r7h(B
  resolveExcRetSw()
    $B0J2<$r2r7h(B
      bytepcoff
      exc. handler $B$X$N(B jump
      method tail $B$X$N(B jump
      tableswitch, lookupswitch $B$N(B native PC $BI=$r:n@.(B
  native code $B$r%3%T!<(B
  (native code $B$rJ]B8(B)
  resolveDynamicConstants()
    $BDj?t(B (dynamic) $B$r2r7h(B
  makeExcTable()
    $BNc30I=$K(B native PC (offset), handler $B$N=i4|(B state $B$r=q$-9~$`(B
  resolveFunctionSymbols()
    $B4X?t8F$S=P$7$r2r7h(B

$BDj?t(B
  bipush
    value
  ldc2_w
    val[32:63], val[0:31]
  iload
    index * 4
  lload
    index * 4, (index + 1) * 4
  istore
    index * 4
  lstore
    index * 4, (index + 1) * 4
  iinc
    (signed char *pc)[2], pc[1] * 4
  jsr
    native offset of a next instruction
  ret
    index * 4
  tableswitch
    low, high, <table offset>
  lookupswitch
    npairs, <table offset>
  getstatic
    address
  getstatic2
    address, address + 4
  putstatic
    address
  putstatic2
    address, address + 4
  getfield
    slot
  getfield2
    slot
  putfield
    slot
  putfield2
    slot
  invokevirtual
  invokevirtual_quick
  invokevirtualobject_quick
    args_size, methodIndex, retsize
  invokespecial
    args_size, method, local_var_space, retsize
  invokestatic
    args_size, method, local_var_space, retsize
  invokeinterface
    args_size, guessptr, imethod, retsize
  new
    cb
  newarray
    type
  anewarray
    elem_clazz
  checkcast
    cb
  instanceof
    cb
  multianewarray
    dimensions, arrayclazz
  invokeignored_quick
    args_size
  new_quick
    cb

jump
  ifeq, ne, lt, ge, gt, le
    JP_ROP " " STR(ADDR_JP)
  if_icmpeq, ne, lt, ge, gt, le
    JP_ROP " " STR(ADDR_JP)
  goto
    jmp   STR(ADDR_JP)
  jsr
    jmp   STR(ADDR_JP)
  ret
    __asm__("addl  %0,%%eax\n\t"		/* eax += nativecode */
	    "jmp   %%eax" :
	    : "m" (nativecode));
  ifnull
    jz    STR(ADDR_JP)
  ifnonnull
    jnz   STR(ADDR_JP)

$B>r7oJ,4t(B
  ifeq, ne, lt, ge, gt, le
  if_icmpeq, ne, lt, ge, gt, le
  ifnull
  ifnonnull
  tableswitch
  lookupswitch
$B%8%c%s%W(B
  goto
  jsr
?
  ret

x86 jump instructions
je
  74 XX
  0f 84 XX XX XX XX
jne
  75
  0f 85
jl
  7c
  0f 8c
jge
  7d
  0f 8d
jg
  7f
  0f 8f
jle
  7e
  0f 8e
jz == je
jnz == jne
jmp
  eb
  e9

ex) ifeq 4 -> 2
  code_ifeq
    (cmpl $B4^$`(B)
  jne
  state_to2(state:4)
  jmp $B%8%c%s%W@h(B
ex) ifeq 4 -> 4
  code_ifeq
    (cmpl $B4^$`(B)
  je $B%8%c%s%W@h(B


callee head: 8 byte
  55		pushl %ebp
  89 e5		movl  %esp,%ebp
  83 ec XX	subl  $0xXX,%esp
  57		pushl %edi
  56		pushl %esi
( 53		pushl %ebx)

callee tail: 7 byte
  8d 65 YY	leal  0xffffffYY(%ebp),%esp
( 5b		popl  %ebx)
  5e		popl  %esi
  5f		popl  %edi
  c9		leave
  c3		ret

0xYY = 0x100 - 0xXX - (4 * push$B$7$?%l%8%9%??t(B)
