これらは, C2 JIT Compiler 用の低レベル中間語.
C2 JIT Compiler 用の低レベル中間語は MachNode クラスのサブクラスとして表現されている. また命令のオペランドは MachOper クラスのサブクラスとして表現されている
ただし, MachNode クラス/MachOper クラスのサブクラスの大半は AD ファイルで定義されている. そのため, ここでは MachNode 関連の基底クラス, 及び AD ファイルで定義できない MachNode クラス (MachIdealNode クラス及びそのサブクラス) が定義されている.
低レベル中間語における命令を表す Node クラスの基底クラス. 低レベル中間語の Node は MachNode クラスのサブクラスとして表現されている.
(低レベル中間語であるため, 多くの MachNode クラスでは 1つの MachNode オブジェクトが 1つのマシン語命令に対応する. ただし多数のマシン語命令に対応するような大きな MachNode もある)
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachNode---------------------------------------
// Base type for all machine specific nodes. All node classes generated by the
// ADLC inherit from this class.
class MachNode : public Node {
使用する際には, rule() メソッド等をオーバーライドしたサブクラスを作ればいい.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
virtual uint rule() const = 0; // Machine-specific opcode
スーパークラスである Node クラスのフィールドに加えて, 以下のフィールドを持つ.
オペランドの個数
オペランドを表す MachOper の配列
((cite: hotspot/src/share/vm/opto/machnode.hpp))
// Array of complex operand pointers. Each corresponds to zero or
// more leafs. Must be set by MachNode constructor to point to an
// internal array of MachOpers. The MachOper array is sized by
// specific MachNodes described in the ADL.
uint _num_opnds;
MachOper **_opnds;
See: here for details
低レベル中間語における「オペランド」を表すクラスの基底クラス (e.g. レジスタ, 即値, メモリアドレス(アドレッシングモード), etc).
MachNode が作るグラフ上では, 各 MachNode オブジェクトの MachNode::_opnds フィールドに格納されている.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (OPERANDS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//---------------------------MachOper------------------------------------------
class MachOper : public ResourceObj {
使用する際には, opcode() メソッド等をオーバーライドしたサブクラスを作ればいい.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
// Opcode
virtual uint opcode() const = 0;
See: here for details
MachNode クラスのサブクラスの1つ.
型情報を持つ MachNode クラスの基底クラス.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachTypeNode----------------------------
// Machine Nodes that need to retain a known Type.
class MachTypeNode : public MachNode {
スーパークラスである MachNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
const Type *_bottom_type;
See: here for details
MachNode クラスのサブクラスの1つ.
通常の MachNode クラスは AD ファイル内で定義され Matcher によって Ideal から生成される. MachIdealNode はそれ以外の MachNode クラスの基底クラス (これらは C++ で書かれたソースコード中で明示的に生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachIdealNode----------------------------
// Machine specific versions of nodes that must be defined by user.
// These are not converted by matcher from ideal nodes to machine nodes
// but are inserted into the code by the compiler.
class MachIdealNode : public MachNode {
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
ブレークポイント命令を表す.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachBreakpointNode----------------------------
// Machine breakpoint or interrupt Node
class MachBreakpointNode : public MachIdealNode {
Compile::Output() 内で(のみ)生成されている.
なお, 現在は以下の箇所に埋め込まれている模様.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
constant table のアドレスを表す (See: Compile::ConstantTable).
ただし現状では sparc 上でしか意味を持たない (x86 では MachConstantBaseNode::emit() は空) (See: MachConstantBaseNode::emit(), Compile::ConstantTable::calculate_offsets_and_size()).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachConstantBaseNode--------------------------
// Machine node that represents the base address of the constant table.
class MachConstantBaseNode : public MachIdealNode {
各 Compile オブジェクトの _mach_constant_base_node フィールドに(のみ)格納されている (ただし, MachConstantBaseNode オブジェクトの生成自体は実際に必要になるまで遅延されている).
Compile::mach_constant_base_node() 内で(のみ)生成されている (= 初めて使用される時まで生成が遅延されている).
See: here for details
MachNode クラスのサブクラスの1つ.
constant table 中の定数値を表す MachNode クラスの基底クラス (See: Compile::ConstantTable, Compile::Constant).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachConstantNode-------------------------------
// Machine node that holds a constant which is stored in the constant table.
class MachConstantNode : public MachNode {
スーパークラスである MachNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
Compile::Constant _constant; // This node's constant.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
"Unvalidated Entry Point (または Unverified Entry Point)" の処理を表す MachIdealNode
(なお Unvalidated Entry Point とは, Inline Caching 用のエントリポイント. このエントリポイントに到達した段階では型が正しいかどうかは判明しておらず, ここで type check を受けて実際のエントリポイント(VEP(verified entry point))へと進む).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachUEPNode-----------------------------------
// Machine Unvalidated Entry Point Node
class MachUEPNode : public MachIdealNode {
Compile::Output() 内で(のみ)生成されている.
(メソッドの先頭に埋め込まれる)
MachUEPNode::emit() に "Unvalidated Entry Point" 処理を出力するルーチンが実装されている.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
メソッド開始時の処理を表す (e.g. レジスタの退避, スタックフレームの確保, etc).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachPrologNode--------------------------------
// Machine function Prolog Node
class MachPrologNode : public MachIdealNode {
Compile::Output() 内で(のみ)生成されている.
(StartNode と置き換えられる形で, メソッドの先頭に埋め込まれる) (See: StartNode)
MachPrologNode::emit() にメソッド開始時処理を出力するルーチンが実装されている.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
メソッド終了時(return直前)の処理を表す (e.g. レジスタの復帰, スタックフレームの破棄, etc).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachEpilogNode--------------------------------
// Machine function Epilog Node
class MachEpilogNode : public MachIdealNode {
Compile::Output() 内で(のみ)生成されている.
(コンパイル対象のメソッドから exit する Node (e.g. ReturnNode, RethrowNode, TailCallNode, etc) の直前に挿入される)
MachEpilogNode::emit() にメソッド終了時処理を出力するルーチンが実装されている.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
NOP 命令を表す.
(これはパディングを入れる際などに使用されている)
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachNopNode-----------------------------------
// Machine function Nop Node
class MachNopNode : public MachIdealNode {
(フィールド内に格納されているインスタンスも存在する)
以下の箇所で(のみ)生成されている.
Compile::Shorten_branches()
Compile::Fill_buffer()
Scheduling::Scheduling()
(Scheduling::_nop フィールドの初期化用)
(これは AD ファイルから生成される関数)
MachNopNode::emit() に NOP 命令を出力するルーチンが実装されている.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
レジスタ割り当てでスピルが発生した場合のコピー処理を表す.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachSpillCopyNode------------------------------
// Machine SpillCopy Node. Copies 1 or 2 words from any location to any
// location (stack or register).
class MachSpillCopyNode : public MachIdealNode {
以下の箇所で(のみ)生成されている.
MachSpillCopyNode::emit() にコピー処理を出力するルーチンが実装されている.
See: here for details
MachIdealNode クラスの具象サブクラスの1つ.
NULL かどうかの暗黙的な検査処理(implicit null check)を表す.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachNullChkNode--------------------------------
// Machine-dependent null-pointer-check Node. Points a real MachNode that is
// also some kind of memory op. Turns the indicated MachNode into a
// conditional branch with good latency on the ptr-not-null path and awful
// latency on the pointer-is-null path.
class MachNullCheckNode : public MachIdealNode {
Block::implicit_null_check() 内で(のみ)生成されている.
MachNullCheckNode::emit() に検査処理を出力するルーチンが実装されている (といっても implicit null check なので何もしない).
See: here for details
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachProjNode----------------------------------
// Machine-dependent Ideal projections (how is that for an oxymoron). Really
// just MachNodes made by the Ideal world that replicate simple projections
// but with machine-dependent input & output register masks. Generally
// produced as part of calling conventions. Normally I make MachNodes as part
// of the Matcher process, but the Matcher is ill suited to issues involving
// frame handling, so frame handling is all done in the Ideal world with
// occasional callbacks to the machine model for important info.
class MachProjNode : public ProjNode {
See: here for details
MachNode クラスのサブクラスの1つ.
Ideal における IfNode/CountedLoopEndNode/etc(?#TODO) の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachIfNode-------------------------------------
// Machine-specific versions of IfNodes
class MachIfNode : public MachNode {
スーパークラスである MachNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
float _prob; // Probability branch goes either way
float _fcnt; // Frequency counter
See: here for details
MachNode クラスのサブクラスの1つ.
Ideal における FastLockNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachFastLockNode-------------------------------------
// Machine-specific versions of FastLockNodes
class MachFastLockNode : public MachNode {
スーパークラスである MachNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
BiasedLockingCounters* _counters;
See: here for details
MachNode クラスのサブクラスの1つ.
Ideal における ReturnNode/Rethrow/TailCallNode/etc(?#TODO) の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachReturnNode--------------------------------
// Machine-specific versions of subroutine returns
class MachReturnNode : public MachNode {
スーパークラスである MachNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
RegMask *_in_rms; // Input register masks, set during allocation
ReallocMark _nesting; // assertion check for reallocations
const TypePtr* _adr_type; // memory effects of call or return
See: here for details
MachReturnNode クラスのサブクラスの1つ.
Ideal における SafePointNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
(何故 MachReturnNode のサブクラスかというと... ?? #TODO)
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachSafePointNode-----------------------------
// Machine-specific versions of safepoints
class MachSafePointNode : public MachReturnNode {
スーパークラスである MachReturnNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
JVMState* _jvms; // Pointer to list of JVM State Objects
uint _jvmadj; // Extra delta to jvms indexes (mach. args)
See: here for details
MachSafePointNode クラスのサブクラスの1つ.
Ideal における CallNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachCallNode----------------------------------
// Machine-specific versions of subroutine calls
class MachCallNode : public MachSafePointNode {
スーパークラスである MachSafePointNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
const TypeFunc *_tf; // Function type
address _entry_point; // Address of the method being called
float _cnt; // Estimate of number of times called
uint _argsize; // Size of argument block on stack
See: here for details
MachCallNode クラスのサブクラスの1つ.
Ideal における CallJavaNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachCallJavaNode------------------------------
// "Base" class for machine-specific versions of subroutine calls
class MachCallJavaNode : public MachCallNode {
スーパークラスである MachCallNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
ciMethod* _method; // Method being direct called
int _bci; // Byte Code index of call byte code
bool _optimized_virtual; // Tells if node is a static call or an optimized virtual
bool _method_handle_invoke; // Tells if the call has to preserve SP
See: here for details
MachCallJavaNode クラスのサブクラスの1つ.
Ideal における CallStaticJavaNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachCallStaticJavaNode------------------------
// Machine-specific versions of monomorphic subroutine calls
class MachCallStaticJavaNode : public MachCallJavaNode {
スーパークラスである MachCallJavaNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
const char *_name; // Runtime wrapper name
See: here for details
MachCallJavaNode クラスのサブクラスの1つ.
Ideal における CallDynamicJavaNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachCallDynamicJavaNode------------------------
// Machine-specific versions of possibly megamorphic subroutine calls
class MachCallDynamicJavaNode : public MachCallJavaNode {
スーパークラスである MachCallJavaNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
int _vtable_index;
See: here for details
MachCallJavaNode クラスのサブクラスの1つ.
Ideal における CallRuntimeNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachCallRuntimeNode----------------------------
// Machine-specific versions of subroutine calls
class MachCallRuntimeNode : public MachCallNode {
スーパークラスである MachCallJavaNode クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
const char *_name; // Printable name, if _method is NULL
See: here for details
MachCallRuntimeNode クラスのサブクラス.
Ideal における CallLeafNode/CallLeafNoFPNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照) (なお, AD ファイル以外で定義されているサブクラスも存在する).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
class MachCallLeafNode: public MachCallRuntimeNode {
このクラスで新たに定義されたフィールドはない.
See: here for details
MachReturnNode クラスのサブクラス.
Ideal における HaltNode の MachNode 版 (上記の Ideal からはこのクラス(のサブクラス)が生成される).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス. サブクラスは AD ファイル内で定義されている (INSTRUCTIONS 節を参照).
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachHaltNode-----------------------------------
// Machine-specific versions of halt nodes
class MachHaltNode : public MachReturnNode {
このクラスで新たに定義されたフィールドはない.
See: here for details
MachNode クラスの具象サブクラスの1つ.
ADLC が使用する temporary register を表現するための MachNode.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------MachTempNode-----------------------------------
// Node used by the adlc to construct inputs to represent temporary registers
class MachTempNode : public MachNode {
ADLC が生成する各 MachNode クラスの MachNode::Expand() 内で使用されている模様 (なお, MachNode::Expand() はひとつの MachNode を複数の MachNodes に分割したい時に使うメソッド). (#TODO 他の使用箇所)
See: here for details
MachOper クラスの具象サブクラスの1つ.
このクラスは, ブランチ命令の飛び先となる「ラベル」を表す.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------labelOper--------------------------------------
// Machine-independent version of label operand
class labelOper : public MachOper {
以下の箇所で生成されている. (#TODO 他の生成箇所)
(これは ADLC が生成する関数)
スーパークラスである MachOper クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
// Supported for fixed size branches
Label* _label; // Label for branch(es)
uint _block_num;
See: here for details
MachOper クラスの具象サブクラスの1つ.
このクラスは, メソッド呼び出し命令が使用する「メソッドの先頭アドレス」を表す.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
//------------------------------methodOper--------------------------------------
// Machine-independent version of method operand
class methodOper : public MachOper {
以下の箇所で生成されている. (#TODO 他の生成箇所)
(これは ADLC が生成する関数)
(これは ADLC が生成する関数)
スーパークラスである MachOper クラスのフィールドに加えて, 以下のフィールドを持つ.
((cite: hotspot/src/share/vm/opto/machnode.hpp))
intptr_t _method; // Address of method
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.