2017-07-17 1 views
0

OOL(アウトライン)コードとは何ですか?私はIONコンパイラでそれを見つけましたが、何が起こっているのか理解できません。OOL(アウトライン)コード

bool CodeGeneratorShared::generateOutOfLineCode() { 
    for (size_t i = 0; i < outOfLineCode_.length(); i++) { 
    // Add native => bytecode mapping entries for OOL sites. 
    // Not enabled on asm.js yet since asm doesn't contain bytecode mappings. 
    if (!gen->compilingAsmJS()) { 
     if (!addNativeToBytecodeEntry(outOfLineCode_[i]->bytecodeSite())) 
      return false; 
    } 

    if (!gen->alloc().ensureBallast()) 
     return false; 

    JitSpew(JitSpew_Codegen, "# Emitting out of line code"); 

    masm.setFramePushed(outOfLineCode_[i]->framePushed()); 
    lastPC_ = outOfLineCode_[i]->pc(); 
    outOfLineCode_[i]->bind(&masm); 

    outOfLineCode_[i]->generate(this); 
    } 

    return !masm.oom(); 
} 

私はそれについての情報を見つけるためにgoogleを使用しようとしましたが、成功しませんでした。多分あなたはそれが何であるか私に何か考えを与えることができますか?ありがとうございました:)

+1

ソースをリンクできますか? – Bergi

+0

すべてのコードはとても大きいです。私は、行外コードが生成されている場合にのみメソッドをアタッチします。したがって、https://archive.mozilla.org/pub/mozilla.org/js/ – Mano

+0

からクローンできるすべてのコードありがとうございますが、どのzipアーカイブ(またはどのエンジンバージョン)のファイルがこれですか? – Bergi

答えて

2

私はソースを調べました。「アウトライン」とは、通常のコード/機能の後に生成されるコードを意味します。

CodeGenerator::generateは基本的に次のようになります。

generateProlog(); 
generateBody(); 
generateEpilog(); 
generateOutOfLineCode(); 

だからラインコードのうち、コードの終了後に生成されます。これは、例外的な制御フローと、最適化解除、例外スローなどを引き起こすコードを命令キャッシュおよび「通常の」プログラムコードから保護するためによく使用されます。

除数が0これは、疑似アセンブリ内のコードである場合に例外をスローするように私たちを強制するのは、我々が機能int f(int a, int b) { return a/b; }や言語の意味を持っていると仮定しましょう:

cmp b, 0 
    jump-if-not-zero lbl1 
    call throw_exception 

lbl1: 
    div c, a, b 
    ret c 

あなたはその通常のプログラムフローのニーズを見ることができます例外をスローするコードを飛び越すほとんどの場合、通常bはゼロではないので、無駄になります。ライン外のコードを使用すると、より効率的なコードを生成できます。

cmp b, 0 
    jump-if-zero out-of-line1 
    div c, a, b 
    ret c 

out-of-line1: 
    call throw_exception 

ここでは、稀でなければならないゼロ値だけをジャンプします。 cmp命令とdiv命令も命令キャッシュの使用に適しています。

私のJITでは、nullポインタ例外のスロー、アサートの失敗などのためにラインコードが生成されています.JSとIonMonkeyは異なる操作に使用します。私が見つけたアウト・オブ・ライン・コードの1つの例は、OutOfLineCodeのすべてのライン・コード外のベース・クラスを拡張するWASMのクラスOutOfLineTruncateF32OrF64ToI32です。

また、IonMonkeyのアウトラインコードでは、フィールドrejoinを使用して通常のコードフローに戻ることができます。

関連する問題