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 | } | +-----+