| 14.8.27. OutputUnroll_Line メンバ関数説明 |
| メンバ関数名 | OutputUnroll_Line |
|---|---|
| 定義ファイル名 | TuneRegion.cpp |
| 定義行 | 2718 |
| 所属名 | TTuneRegion |
| アクセス属性 | public |
| 宣言形式 | int OutputUnroll_Line ( FILE * fp , int TokPos , DWORD UseDoRefValBits , int RefValIdx ) |
| 概要 | 多重化したコードを1行出力する。 UseDoRefValBitsとRefValIdxによるDo参照変数部分の置換を行った行を出力する。 RefValIdxは、Countに対しての番号となる。(呼び出し側から指定される) ここから、別の解析を呼ぶことはない。 最後のトークン(通常はtid_LineEnd)の位置を返す。 |
| 戻り値 | |
| パラメタ説明 | fp 出力先ファイルポインタ TokPos トークン位置 UseDoRefValBits 使用中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::ChangeFromOrgStr | TuneRegion.cpp | 3781 |
| 2 | TTuneRegion::GetBitIdx | TuneRegion.cpp | 3660 |
| 3 | TTuneRegion::GetDoValAddValue | TuneRegion.cpp | 3828 |
| 4 | TTuneRegion::GetNewValName | TuneRegion.cpp | 3563 |
| 5 | TTuneRegion::GetNewValName | TuneRegion.cpp | 3617 |
| 6 | TTuneRegion::GetValAddValue | TuneRegion.cpp | 3880 |
| 7 | TTuneRegion::SepLongStr | TuneRegion.cpp | 4274 |
| 8 | c_str | ||
| 9 | fprintf | ||
| 10 | IntToStr | ||
| 11 | Pos |
| 名称 | 定義ファイル名 | 定義行 | |
|---|---|---|---|
| 1 | TTuneRegion::ArgValList | TuneRegion.h | 140 |
| 2 | TTuneRegion::DoValIdx | TuneRegion.h | 103 |
| 3 | TTuneRegion::DoValName | TuneRegion.h | 102 |
| 4 | TTuneRegion::OffsetStr | TuneRegion.h | 146 |
| 5 | TTuneRegion::TokenEndPos | TuneRegion.h | 123 |
| 6 | TTuneRegion::TokenList | TuneRegion.h | 120 |
| 7 | TTuneRegion::UnrollCount | TuneRegion.h | 96 |
| 8 | TTuneRegion::UnRollDoRefValBits | TuneRegion.h | 94 |
| 名称 | 種別 | 定義ファイル名 | 定義行 | |
|---|---|---|---|---|
| 1 | TToken | クラス | pass1.h | 216 |
| 2 | TValData | クラス | pass2.h | 42 |
関数論理チャート
| +----------------------------------------------------------------------------------------------+
2718 +--+ int TTuneRegion::OutputUnroll_Line(FILE *fp,int TokPos,DWORD UseDoRefValBits,int RefValIdx) |
2719 | { |
+--+-------------------------------------------------------------------------------------------+
2720 +--- AnsiString s;
2721 +--- int Idx;
2722 +--- int AddValue; // 変数への加算数
2723 +--- TValData *ValData;
2724 +--- TToken *Token,*TokenB,*TokenF;
2725 +--- int j;
2726 +--- AnsiString OprCheckStr = "(),";
2727 +--- AnsiString NewValName;
2728 |
2729 +--- s = "";
| +----------------------------------------------------------------+
2730 +--+ if(UseDoRefValBits == 0){ // UnRollなしの場合は、そのまま出力 |
| +--+-------------------------------------------------------------+
| | +------------------------------------------+
2731 | +--+ for( ; TokPos < TokenEndPos ; TokPos++){ |
| | +--+---------------------------------------+
2732 | | +--- Token = (TToken *)TokenList->Items[TokPos];
2733 | | +--- s += Token->OrgStr;
| | | +----------------------------------+
2734 | | +--+ if(Token->TokId == tid_LineEnd){ |
| | | +--+-------------------------------+
| | | | +--------+
2735 | | | +--+ break; |
| | | | +--------+
| | | +-+---+
2736 | | | | } |
| | | +-----+
| | +-+---+
2737 | | | } |
| | +-----+
| | +--------------------------------+
2738 | +--+ if((s != "")&&(s[1] == ' ')){ |
| | +--+-----------------------------+
2739 | | +--- s = OffsetStr + s;
| | +-+---+
2740 | | | } |
| | +-----+
2741 | +--- s = SepLongStr(s);
2742 | +--- fprintf(fp,"%s",s.c_str());
| | +----------------+
2743 | +--+ return TokPos; |
| | +----------------+
| +-+---+
2744 | | } |
| +-----+
2745 +--- //
2746 | // DO依存変数または、Do変数を含んだ式!
2747 | // 変数部分の置換を行う
2748 | //
| +----------------------------------------------------------------+
2749 +--+ for(j = TokPos ; j < TokenEndPos ; j++){ // 行の先頭から、最後 |
| +--+-------------------------------------------------------------+
2750 | +--- Token = (TToken *)TokenList->Items[j];
| | +----------------------------------+
2751 | +--+ if(Token->TokId == tid_LineEnd){ |
| | +--+-------------------------------+
2752 | | +--- TokPos = j;
| | | +--------+
2753 | | +--+ break; |
| | | +--------+
| | +-+---+
2754 | | | } |
| | +-----+
2755 | +--- ValData = (TValData *)Token->ValData;
| | +----------------------+
2756 | +--+ if(ValData != NULL){ |
| | +--+-------------------+
| | | +------------------------------+
2757 | | +--+ if(ValData->DoValBits != 0){ |
| | | +--+---------------------------+
2758 | | | +--- //
2759 | | | | // DO変数の置き換え
2760 | | | | // 前後が オペレータでなければ、()を付けない。
2761 | | | | // 加算する値は、UnrollCount[] と kk によって決まる
2762 | | | | //
2763 | | | +--- Idx = GetBitIdx(ValData->DoValBits);
2764 | | | +--- TokenB = (TToken *)TokenList->Items[j-1];
2765 | | | +--- TokenF = (TToken *)TokenList->Items[j+1];
2766 | | | |
2767 | | | +--- // fprintf(fp,"AddValue %s[RefValIdx=%d:DoValBits %04X] DoValIdx = %d UnRollBits = %04X \n",ValData->Str.c_str(),
2768 | | | | // RefValIdx,ValData->DoValBits,DoValIdx,UnRollDoRefValBits);
2769 | | | |
2770 | | | +--- AddValue = GetDoValAddValue(RefValIdx,
2771 | | | | ValData->DoValBits & UnRollDoRefValBits,
2772 | | | | DoValIdx,UnrollCount);
| | | | +--------------------+
2773 | | | +--+ if(AddValue == 0){ |
| | | | +--+-----------------+
2774 | | | | +--- s += ChangeFromOrgStr(Token->OrgStr,"");
2775 | | | | +--- s += DoValName[Idx];
| | | | +-+---+
2776 | | | | | } |
| | | | +-+---+
| | | | +-+-----------------------------------------------+
2776 | | | | | else if((OprCheckStr.Pos(TokenB->Str) != 0)&& |
2777 | | | | | (OprCheckStr.Pos(TokenF->Str) != 0)){ |
| | | | +-+-----------------------------------------------+
2778 | | | | +--- s += ChangeFromOrgStr(Token->OrgStr,"");
2779 | | | | +--- s += DoValName[Idx] + "+" + IntToStr(AddValue);
| | | | +-+---+
2780 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
2780 | | | | | else{ |
| | | | +-+-------+
2781 | | | | +--- s += ChangeFromOrgStr(Token->OrgStr,"");
2782 | | | | +--- s += "("+DoValName[Idx] + "+"+ IntToStr(AddValue)+")";
| | | | +-+---+
2783 | | | | | } |
| | | | +-----+
| | | +-+---+
2784 | | | | } |
| | | +-+---+
| | | +-+-------------------------------------------------------------+
2784 | | | | else if(((ValData->RefDoValBits & UnRollDoRefValBits) != 0) |
2785 | | | | &&(ValData->ArrayLevel == 0)){ |
| | | +-+-------------------------------------------------------------+
2786 | | | +--- //
2787 | | | | // Do依存変数の置き換え
2788 | | | | // ・配列は、対象外とする。(Doの変数が含まれると想定)
2789 | | | | // ・Do依存変数のAddValueを求める(Idx)
2790 | | | | //
2791 | | | +--- AddValue = GetValAddValue(RefValIdx,
2792 | | | | ValData->RefDoValBits & UnRollDoRefValBits,
2793 | | | | DoValIdx,UnrollCount);
| | | | +--------------------+
2794 | | | +--+ if(AddValue == 0){ |
| | | | +--+-----------------+
2795 | | | | +--- NewValName = ValData->Str;
| | | | +-+---+
2796 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
2796 | | | | | else{ |
| | | | +-+-------+
2797 | | | | +--- NewValName = GetNewValName(ValData->Str,AddValue+1,ArgValList);
| | | | +-+---+
2798 | | | | | } |
| | | | +-----+
2799 | | | +--- s += ChangeFromOrgStr(Token->OrgStr,NewValName);
| | | +-+---+
2800 | | | | } |
| | | +-+---+
| | | +-+-------+
2800 | | | | else{ |
| | | +-+-------+
2801 | | | +--- s += Token->OrgStr;
| | | +-+---+
2802 | | | | } |
| | | +-----+
| | +-+---+
2803 | | | } |
| | +-+---+
| | +-+-------+
2803 | | | else{ |
| | +-+-------+
2804 | | +--- s += Token->OrgStr;
| | +-+---+
2805 | | | } |
| | +-----+
| +-+---+
2806 | | } |
| +-----+
| +--------------------------------+
2807 +--+ if((s != "")&&(s[1] == ' ')){ |
| +--+-----------------------------+
2808 | +--- s = OffsetStr + s;
| +-+---+
2809 | | } |
| +-----+
2810 +--- s = SepLongStr(s);
2811 +--- fprintf(fp,"%s\n",s.c_str());
| +----------------+
2812 +--+ return TokPos; |
| +----------------+
+-+---+
2813 | } |
+-----+