Top

除算に関する高レベル中間語(Ideal)クラス (DivINode, DivLNode, DivFNode, DivDNode, ModINode, ModLNode, ModFNode, ModDNode, DivModNode, DivModINode, DivModLNode)

これらは, C2 JIT Compiler 用の高レベル中間語を表すクラス. より具体的に言うと, 主に「除算」を表すクラス.

(なお, 他の四則演算と異なり, Div や Mod 自体には abstract な基底クラスは存在しない. ただし DivMod には存在する)

クラス一覧(class list)


DivINode

概要(Summary)

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 {

内部構造(Internal structure)

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 ) {}

詳細(Details)

See: here for details


DivLNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは long 値同士の除算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Long division
    class DivLNode : public Node {

内部構造(Internal structure)

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 ) {}

詳細(Details)

See: here for details


DivFNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは float 値同士の除算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Float division
    class DivFNode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


DivDNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは double 値同士の除算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Double division
    class DivDNode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


ModINode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは int 値同士の剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Integer modulus
    class ModINode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


ModLNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは long 値同士の剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Long modulus
    class ModLNode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


ModFNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは float 値同士の剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Float Modulus
    class ModFNode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


ModDNode

概要(Summary)

Node クラスの具象サブクラスの1つ. このクラスは double 値同士の剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Double Modulus
    class ModDNode : public Node {

内部構造(Internal structure)

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) {}

詳細(Details)

See: here for details


DivModNode

概要(Summary)

MultiNode クラスのサブクラスの1つ. 出力として「除算の結果と剰余算の結果の双方を出す」 Node クラスの基底クラス.

(<= 除算と剰余算は共通部が多いので, 両方の結果が必要な場合は一度に計算すると高速化できる. DivModNode はそれを表現するためのクラス)

なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Division with remainder result.
    class DivModNode : public MultiNode {

内部構造(Internal structure)

2項演算を表すノードなので, (control input も含めて) 3つの入力ノードを持つ.

なお, コンストラクタで指定することにより 0 以外の control input を設定できる.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
      DivModNode( Node *c, Node *dividend, Node *divisor );

詳細(Details)

See: here for details


DivModINode

概要(Summary)

DivModNode クラスの具象サブクラスの1つ. このクラスは int 値同士の除算/剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Integer division with remainder result.
    class DivModINode : public DivModNode {

使われ方(Usage)

生成箇所(where its instances are created)

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() では以下のように処理が行われる.

参考(for your information): DivModINode::make()

See: here for details

内部構造(Internal structure)

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) {}

備考(Notes)

なお, このクラスは product オプションである UseDivMod が true の場合にしか作成されない. ただしデフォルトでは true.

    ((cite: hotspot/src/share/vm/opto/c2_globals.hpp))
      product(bool, UseDivMod, true,                                            \
              "Use combined DivMod instruction if available")                   \

詳細(Details)

See: here for details


DivModLNode

概要(Summary)

DivModNode クラスの具象サブクラスの1つ. このクラスは long 値同士の除算/剰余演算用.

    ((cite: hotspot/src/share/vm/opto/divnode.hpp))
    // Long division with remainder result.
    class DivModLNode : public DivModNode {

使われ方(Usage)

生成箇所(where its instances are created)

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() では以下のように処理が行われる.

参考(for your information): DivModLNode::make()

See: here for details

内部構造(Internal structure)

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) {}

備考(Notes)

なお, このクラスは product オプションである UseDivMod が true の場合にしか作成されない. ただしデフォルトでは true.

    ((cite: hotspot/src/share/vm/opto/c2_globals.hpp))
      product(bool, UseDivMod, true,                                            \
              "Use combined DivMod instruction if available")                   \

詳細(Details)

See: here for details



This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.