hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
address TemplateInterpreterGenerator::generate_result_handler_for(
BasicType type) {
{- -------------------------------------------
(1) (ここからが生成するコードの始まり)
---------------------------------------- -}
address entry = __ pc();
{- -------------------------------------------
(1) コード生成:
引数で指定された型に応じて, 適切なコードを生成する.
(ここの処理でやることは, 主に値の bit 幅をそろえるのが目的)
* T_BOOLEAN
「rax が非ゼロなら rax に 1 をセットする. 0 なら 0 のままとする.
(See: MacroAssembler::c2bool())」
* T_CHAR
「rax の下位 16bit(符号無し) 分だけを rax にセットする.
(movzwl でコピーするだけ)」
* T_BYTE
「rax の下位 8bit(符号あり) 分だけを rax にセットする.
(See: MacroAssembler::sign_extend_byte())」
* T_SHORT
「rax の下位 16bit(符号あり) 分だけを rax にセットする.
(See: MacroAssembler::sign_extend_short())」
* T_INT
「何もしない」
* T_LONG
「何もしない」
* T_VOID
「何もしない」
* T_FLOAT
「何もしない」
* T_DOUBLE
「何もしない」
* T_OBJECT
「フレーム中の frame::interpreter_frame_oop_temp_offset 野市に待避していた値を I0(= Itos_i) にロードする.」
---------------------------------------- -}
switch (type) {
case T_BOOLEAN: __ c2bool(rax); break;
case T_CHAR : __ movzwl(rax, rax); break;
case T_BYTE : __ sign_extend_byte(rax); break;
case T_SHORT : __ sign_extend_short(rax); break;
case T_INT : /* nothing to do */ break;
case T_LONG : /* nothing to do */ break;
case T_VOID : /* nothing to do */ break;
case T_FLOAT : /* nothing to do */ break;
case T_DOUBLE : /* nothing to do */ break;
case T_OBJECT :
// retrieve result from frame
__ movptr(rax, Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize));
// and verify it
__ verify_oop(rax);
break;
default : ShouldNotReachHere();
}
{- -------------------------------------------
(1) コード生成:
「リターン」
---------------------------------------- -}
__ ret(0); // return from result handler
{- -------------------------------------------
(1) 以上で生成したコードの先頭アドレスをリターン.
---------------------------------------- -}
return entry;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.