これらは, C2 JIT Compiler 用の高レベル中間語を表すクラス. より具体的に言うと, 主に「除算」を表すクラス.
(なお, 他の四則演算と異なり, Div や Mod 自体には abstract な基底クラスは存在しない. ただし DivMod には存在する)
Node クラスの具象サブクラスの1つ. このクラスは int 値同士の除算用.
なお, semantics は idiv バイトコード命令に合わせている. そのため MinInt/-1 == MinInt としなければいけないことに注意.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Integer division
// Note: this is division as defined by JVMS, i.e., MinInt/-1 == MinInt.
// On processors which don't naturally support this special case (e.g., x86),
// the matcher or runtime system must take care of this.
class DivINode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivINode( Node *c, Node *dividend, Node *divisor ) : Node(c, dividend, divisor ) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは long 値同士の除算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Long division
class DivLNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivLNode( Node *c, Node *dividend, Node *divisor ) : Node(c, dividend, divisor ) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは float 値同士の除算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Float division
class DivFNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる. ただし現状では 0 しか指定されていない.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivFNode( Node *c, Node *dividend, Node *divisor ) : Node(c, dividend, divisor) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは double 値同士の除算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Double division
class DivDNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる. ただし現状では 0 しか指定されていない.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivDNode( Node *c, Node *dividend, Node *divisor ) : Node(c,dividend, divisor) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは int 値同士の剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Integer modulus
class ModINode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
ModINode( Node *c, Node *in1, Node *in2 ) : Node(c,in1, in2) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは long 値同士の剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Long modulus
class ModLNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
ModLNode( Node *c, Node *in1, Node *in2 ) : Node(c,in1, in2) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは float 値同士の剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Float Modulus
class ModFNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる. ただし現状では 0 しか指定されていない.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
ModFNode( Node *c, Node *in1, Node *in2 ) : Node(c,in1, in2) {}
See: here for details
Node クラスの具象サブクラスの1つ. このクラスは double 値同士の剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Double Modulus
class ModDNode : public Node {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる. ただし現状では 0 しか指定されていない.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
ModDNode( Node *c, Node *in1, Node *in2 ) : Node(c, in1, in2) {}
See: here for details
MultiNode クラスのサブクラスの1つ. 出力として「除算の結果と剰余算の結果の双方を出す」 Node クラスの基底クラス.
(<= 除算と剰余算は共通部が多いので, 両方の結果が必要な場合は一度に計算すると高速化できる. DivModNode はそれを表現するためのクラス)
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Division with remainder result.
class DivModNode : public MultiNode {
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivModNode( Node *c, Node *dividend, Node *divisor );
See: here for details
DivModNode クラスの具象サブクラスの1つ. このクラスは int 値同士の除算/剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Integer division with remainder result.
class DivModINode : public DivModNode {
DivModINode::make() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
Compile::Optimize() -> Compile::final_graph_reshaping() -> final_graph_reshaping_walk() -> final_graph_reshaping_impl() -> DivModINode::make()
(<= final_graph_reshaping_impl() 内で引数が同じ DivINode と ModINode が見つかれば, その2つがマージされて作成される)
なお, DivModINode::make() では以下のように処理が行われる.
See: here for details
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivModINode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
なお, このクラスは product オプションである UseDivMod が true の場合にしか作成されない. ただしデフォルトでは true.
((cite: hotspot/src/share/vm/opto/c2_globals.hpp))
product(bool, UseDivMod, true, \
"Use combined DivMod instruction if available") \
See: here for details
DivModNode クラスの具象サブクラスの1つ. このクラスは long 値同士の除算/剰余演算用.
((cite: hotspot/src/share/vm/opto/divnode.hpp))
// Long division with remainder result.
class DivModLNode : public DivModNode {
DivModLNode::make() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
Compile::Optimize() -> Compile::final_graph_reshaping() -> final_graph_reshaping_walk() -> final_graph_reshaping_impl() -> DivModLNode::make()
(<= final_graph_reshaping_impl() 内で引数が同じ DivLNode と ModLNode が見つかれば, その2つがマージされて作成される)
なお, DivModLNode::make() では以下のように処理が行われる.
See: here for details
2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.
なお, コンストラクタで指定することにより 0 以外の control input を設定できる (これは 0 割りを検出するための 0 チェックに制御依存するため. もちろん必ず 0 ではないと分かっているパスでは省略されるため, control input が 0 になることもある)
((cite: hotspot/src/share/vm/opto/divnode.hpp))
DivModLNode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
なお, このクラスは product オプションである UseDivMod が true の場合にしか作成されない. ただしデフォルトでは true.
((cite: hotspot/src/share/vm/opto/c2_globals.hpp))
product(bool, UseDivMod, true, \
"Use combined DivMod instruction if available") \
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.