| 14.8.26. OutputUnroll_IfBlock メンバ関数説明 |
| メンバ関数名 | OutputUnroll_IfBlock |
|---|---|
| 定義ファイル名 | TuneRegion.cpp |
| 定義行 | 3417 |
| 所属名 | TTuneRegion |
| アクセス属性 | public |
| 宣言形式 | int OutputUnroll_IfBlock ( FILE * fp , int TokPos , DWORD UsedDoRefValBits , int RefValIdx ) |
| 概要 | 多重化したIf_Blockを出力する。 最後のトークン(通常はtid_LineEnd)の位置を返す。 多重化に合わせた変数の置換も行われる。 1)ifの構造 EndPos,CondSPpos,CondEPos,BlockSPos,BlockEPos,ElseSPos,ElseEP osを求める 2)条件式がDO依存ならば、ブロック多重化、そうでなければ行単位での多重化を 行う 3)終了トークン位置を返す。 |
| 戻り値 | |
| パラメタ説明 | fp 出力先ファイルポインタ TokPos トークン位置 UsedDoRefValBits 使用中DO参照変数Bits RefValIdx 参照変数インデックス |
| 機能説明 | |
| 備考 |
| 名称 | 定義ファイル名 | 定義行 | |
|---|---|---|---|
| 1 | TTuneRegion::OutputUnroll_DoBlock | TuneRegion.cpp | 2845 |
| 2 | TTuneRegion::OutputUnroll_IfBlock | TuneRegion.cpp | 3417 |
| 3 | TTuneRegion::OutputUnrollExecCode | TuneRegion.cpp | 2411 |
| 名称 | 定義ファイル名 | 定義行 | |
|---|---|---|---|
| 1 | TTuneRegion::CalNewRefValIdx | TuneRegion.cpp | 3726 |
| 2 | TTuneRegion::GetValCountOfBit | TuneRegion.cpp | 3691 |
| 3 | TTuneRegion::OutputUnroll_DoBlock | TuneRegion.cpp | 2845 |
| 4 | TTuneRegion::OutputUnroll_IfBlock | TuneRegion.cpp | 3417 |
| 5 | TTuneRegion::OutputUnroll_Line | TuneRegion.cpp | 2718 |
| 6 | TTuneRegion::SepLongStr | TuneRegion.cpp | 4274 |
| 7 | c_str | ||
| 8 | fprintf |
| 名称 | 定義ファイル名 | 定義行 | |
|---|---|---|---|
| 1 | TTuneRegion::OffsetStr | TuneRegion.h | 146 |
| 2 | TTuneRegion::TokenEndPos | TuneRegion.h | 123 |
| 3 | TTuneRegion::TokenList | TuneRegion.h | 120 |
| 4 | TTuneRegion::UnrollCount | TuneRegion.h | 96 |
| 5 | TTuneRegion::UnRollDoRefValBits | TuneRegion.h | 94 |
| 名称 | 種別 | 定義ファイル名 | 定義行 | |
|---|---|---|---|---|
| 1 | TToken | クラス | pass1.h | 216 |
| 2 | TValData | クラス | pass2.h | 42 |
関数論理チャート
| +--------------------------------------------------------------------------------------------------+
3417 +--+ int TTuneRegion::OutputUnroll_IfBlock(FILE *fp,int TokPos,DWORD UsedDoRefValBits,int RefValIdx) |
3418 | { |
+--+-----------------------------------------------------------------------------------------------+
3419 +--- int SPos,EPos;
3420 +--- int IfNest = 0;
3421 +--- TToken *Token;
3422 +--- int AndRefValIdx;
3423 +--- int cc;
3424 +--- DWORD DoRefValBits;
3425 +--- DWORD NextUsedDoRefValBits; // 次に渡す Do変数参照(処理済)bit
3426 +--- DWORD NowUseDoRefValBits; // 今回の分割数となる UseDoRefValBits
3427 +--- TValData *ValData;
3428 +--- int NewRefValIdx,EndTokPos;
3429 +--- AnsiString s;
3430 |
3431 +--- //
3432 | // IF構造の終了位置を検索する。
3433 | // 対象とするIFは、現在のTopLevelでありNestではない
3434 | //
3435 +--- EPos = -1;
3436 +--- SPos = TokPos;
| +------------------------------------------+
3437 +--+ for( ; TokPos < TokenEndPos ; TokPos++){ |
| +--+---------------------------------------+
3438 | +--- Token = (TToken *)TokenList->Items[TokPos];
| | +------------------------------+
3439 | +--+ if(Token->TokId == tid_IF){ |
| | +--+---------------------------+
3440 | | +--- IfNest++;
| | +-+---+
3441 | | | } |
| | +-+---+
| | +-+-------------------------------------+
3441 | | | else if(Token->TokId == tid_ENDIF){ |
| | +-+-------------------------------------+
3442 | | +--- IfNest--;
| | | +------------------+
3443 | | +--+ if(IfNest == 0){ |
| | | +--+---------------+
3444 | | | +--- EPos = TokPos;
| | | | +--------+
3445 | | | +--+ break; |
| | | | +--------+
| | | +-+---+
3446 | | | | } |
| | | +-----+
| | +-+---+
3447 | | | } |
| | +-----+
| +-+---+
3448 | | } |
| +-----+
3449 +--- //
3450 | // IFを出力する。ネストしたIFやDOに対しての再帰呼び出しも行う。
3451 | // ブロック多重化数だけの出力を行う
3452 | //
| +--------------------------------------------------+
3453 +--+ for(TokPos = SPos ; TokPos <= EPos ; TokPos++){ |
| +--+-----------------------------------------------+
3454 | +--- //
3455 | | // 多重化を式にUnRoll変数が含まれているかでチェックする。
3456 | | // IF文も対象
3457 | | //
3458 | +--- DoRefValBits = 0;
| | +------------------------------------------+
3459 | +--+ for(int kk = TokPos ; kk < EPos ; kk++){ |
| | +--+---------------------------------------+
3460 | | +--- Token = (TToken *)TokenList->Items[kk];
| | | +----------------------------------+
3461 | | +--+ if(Token->TokId == tid_LineEnd){ |
| | | +--+-------------------------------+
| | | | +--------+
3462 | | | +--+ break; |
| | | | +--------+
| | | +-+---+
3463 | | | | } |
| | | +-----+
| | | +------------------------------+
3464 | | +--+ if(Token->ValData == NULL){ |
| | | +--+---------------------------+
| | | | +------------+
3465 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
3466 | | | | } |
| | | +-----+
3467 | | +--- //
3468 | | | // 行内で、UnRoll有効中のDo変数を参照しているかを調べる。
3469 | | | // もし、使用中であれば、多重化の対象となる。
3470 | | | // 多重化は、代入文とDo文とする。(2004/08/26)
3471 | | | //
3472 | | +--- ValData = (TValData *)Token->ValData;
3473 | | +--- DoRefValBits |= ValData->RefDoValBits;
| | +-+---+
3474 | | | } |
| | +-----+
3475 | +--- DoRefValBits &= UnRollDoRefValBits;
3476 | +--- // 次に渡す Do変数参照(処理済)bitを決定(OR)
3477 | +--- NextUsedDoRefValBits = DoRefValBits | UsedDoRefValBits;
3478 | +--- NowUseDoRefValBits = DoRefValBits & (~UsedDoRefValBits);
3479 | +--- cc = GetValCountOfBit(NowUseDoRefValBits,UnrollCount); // ブロック多重化数が確定
| | +--------------------------------------------------------------+
3480 | +--+ for(AndRefValIdx = 0 ; AndRefValIdx < cc ; AndRefValIdx++){ |
| | +--+-----------------------------------------------------------+
3481 | | +--- //
3482 | | | // NewRefValIdxを計算する。
3483 | | | //
3484 | | +--- Token = (TToken *)TokenList->Items[TokPos];
| | | +------------------------------------------------------------------+
3485 | | +--+ if(cc <= 1){ // 分割が発生しない場合は、呼び出し元がそのまま |
| | | +--+---------------------------------------------------------------+
3486 | | | +--- NewRefValIdx = RefValIdx;
| | | +-+---+
3487 | | | | } |
| | | +-+---+
| | | +-+-------+
3487 | | | | else{ |
| | | +-+-------+
3488 | | | +--- // 新たに分割が発生する場合には、計算が必要
3489 | | | | // RefValIdx : UseDoRefValBits
3490 | | | | // kk ; AndUseDoRefValBits の2つを合成した NewRefValIdxを計算。
3491 | | | | // [32] の要素で合成する。
3492 | | | | //
3493 | | | +--- NewRefValIdx = CalNewRefValIdx(RefValIdx,UsedDoRefValBits,
3494 | | | | AndRefValIdx,NowUseDoRefValBits,UnrollCount);
| | | +-+---+
3495 | | | | } |
| | | +-----+
| | | +------------------------------+
3496 | | +--+ if(Token->TokId == tid_DO){ |
| | | +--+---------------------------+
3497 | | | +--- // DOのブロックを出力(END_DO,Moduloの処理まで行う)
3498 | | | +--- EndTokPos = OutputUnroll_DoBlock(fp,TokPos,NextUsedDoRefValBits,NewRefValIdx);
| | | | +------------------------------------------------------+
3499 | | | +--+ if(AndRefValIdx < cc-1){ // 継続がある場合は改行 |
| | | | +--+---------------------------------------------------+
3500 | | | | +--- fprintf(fp,"\n");
| | | | +-+---+
3501 | | | | | } |
| | | | +-----+
| | | +-+---+
3502 | | | | } |
| | | +-+---+
| | | +-+---------------------------------+
3502 | | | | else if(Token->TokId == tid_IF){ |
| | | +-+---------------------------------+
3503 | | | +--- // IFのブロックを出力 if .. endifが対象
| | | | +----------------------+
3504 | | | +--+ if(TokPos == SPos){ |
| | | | +--+-------------------+
3505 | | | | +--- // 対象自体のIF
3506 | | | | +--- EndTokPos = OutputUnroll_Line(fp,TokPos,NextUsedDoRefValBits,NewRefValIdx);
| | | | +-+---+
3507 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
3507 | | | | | else{ |
| | | | +-+-------+
3508 | | | | +--- // これは、ネストしたIFが対象となる
3509 | | | | +--- EndTokPos = OutputUnroll_IfBlock(fp,TokPos,NextUsedDoRefValBits,NewRefValIdx);
| | | | | +------------------------------------------------------+
3510 | | | | +--+ if(AndRefValIdx < cc-1){ // 継続がある場合は改行 |
| | | | | +--+---------------------------------------------------+
3511 | | | | | +--- fprintf(fp,"\n");
| | | | | +-+---+
3512 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
3513 | | | | | } |
| | | | +-----+
| | | +-+---+
3514 | | | | } |
| | | +-+---+
| | | +-+---------------------------------+
3514 | | | | else if(Token->ValData != NULL){ |
| | | +-+---------------------------------+
3515 | | | +--- // 代入文1行を出力
3516 | | | +--- EndTokPos = OutputUnroll_Line(fp,TokPos,NextUsedDoRefValBits,NewRefValIdx);
| | | +-+---+
3517 | | | | } |
| | | +-+---+
| | | +-+-------+
3517 | | | | else{ |
| | | +-+-------+
3518 | | | +--- // それ以外の文は、そのまま出力する
3519 | | | +--- int j;
3520 | | | |
3521 | | | +--- s = "";
| | | | +------------------------------------------+
3522 | | | +--+ for(j = TokPos ; j < TokenEndPos ; j++){ |
| | | | +--+---------------------------------------+
3523 | | | | +--- Token = (TToken *)TokenList->Items[j];
3524 | | | | +--- s += Token->OrgStr;
| | | | | +----------------------------------+
3525 | | | | +--+ if(Token->TokId == tid_LineEnd){ |
| | | | | +--+-------------------------------+
| | | | | | +--------+
3526 | | | | | +--+ break; |
| | | | | | +--------+
| | | | | +-+---+
3527 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
3528 | | | | | } |
| | | | +-----+
| | | | +--------------------------------+
3529 | | | +--+ if((s != "")&&(s[1] == ' ')){ |
| | | | +--+-----------------------------+
3530 | | | | +--- s = OffsetStr + s;
| | | | +-+---+
3531 | | | | | } |
| | | | +-----+
3532 | | | +--- s = SepLongStr(s);
3533 | | | +--- fprintf(fp,"%s",s.c_str());
3534 | | | +--- EndTokPos = j;
| | | +-+---+
3535 | | | | } |
| | | +-----+
| | +-+---+
3536 | | | } |
| | +-----+
3537 | +--- TokPos = EndTokPos;
| +-+---+
3538 | | } |
| +-----+
| +--------------+
3539 +--+ return EPos; |
| +--------------+
+-+---+
3540 | } |
+-----+