abc プロジェクト
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      |  }  | 
            +-----+