abc プロジェクト
14.8.28. OutputUnrollExecCode メンバ関数説明 |
メンバ関数名 | OutputUnrollExecCode |
定義ファイル名 | TuneRegion.cpp |
定義行 | 2411 |
所属名 | TTuneRegion |
アクセス属性 | private |
宣言形式 | void OutputUnrollExecCode ( FILE * fp ) |
概要 | Unrollのサブルーチンを出力する |
戻り値 | |
パラメタ説明 | fp 出力先ファイルポインタ |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
参照外部変数一覧表
参照メンバ変数一覧表
参照先一覧表
関数論理チャート
| +--------------------------------------------------+
2411 +--+ void TTuneRegion::OutputUnrollExecCode(FILE *fp) |
2412 | { |
+--+-----------------------------------------------+
2413 +--- int TokPos;
2414 +--- int i,j,DefPosS;
2415 +--- TValData *ValData;
2416 +--- AnsiString s,s2,ValDefStr;
2417 +--- TToken *Token,*Token2;
2418 +--- int iusw;
2419 +--- int Len;
2420 +--- int RollCount;
2421 +--- int EndTokPos;
2422 |
2423 +--- DoValCount = variedCount;
2424 +--- //
2425 | // Doで使用する変数名を作成する。
2426 | //
| +----------------------------------------------------------+
2427 +--+ for(DoValIdx = 0 ; DoValIdx < DoValCount ; DoValIdx++){ |
| +--+-------------------------------------------------------+
2428 | +--- TValData *DoValData = (TValData *)DoValToken[DoValIdx]->ValData;
2429 | |
2430 | +--- DoTokPos[DoValIdx] = TokenList->IndexOf(DoToken[DoValIdx]);
2431 | +--- DoValName[DoValIdx] = DoValData->Str;
2432 | +--- DoValStr[DoValIdx] = DoValData->Str;
2433 | +--- DoVal_m[DoValIdx] = GetNewValName(DoValData->Str,"m",ArgValList);
2434 | +--- DoVal_i[DoValIdx] = GetNewValName(DoValData->Str,"i",ArgValList);
2435 | +--- DoVal_l[DoValIdx] = GetNewValName(DoValData->Str,"l",ArgValList);
| +-+---+
2436 | | } |
| +-----+
2437 +--- //
2438 | // 指定種類だけのアンロールを行ったサブルーチンを作成する。
2439 | // Sub名 . 引数 , 使用変数 , [コード] がセットされる。
2440 | // コードによって、一時変数が必要となるので、それも追加される。
2441 | //
| +------------------------------------------------------+
2442 +--+ for(CaseIdx = 1 ; CaseIdx <= CaseCount ; CaseIdx++){ |
| +--+---------------------------------------------------+
2443 | +--- // for(CaseIdx = 2 ; CaseIdx <= 2 ; CaseIdx++){ // Test
2444 | +--- //
2445 | | // DoValCountに合わせた、UnRoll数を求める。
2446 | | // 現状では、 2段にLoopは対応していない。(RefBitsのクリアが必要)
2447 | | // また、DoValになる変数のUnrollDoRefValBitsを求める。
2448 | | //
2449 | +--- int idx2,c;
2450 | |
| | +--------------------------+
2451 | +--+ if((CaseIdx % 10) == 0){ |
| | +--+-----------------------+
2452 | | +--- MainF->printNoLog("Output Code "+IntToStr(CaseIdx)+" / "+IntToStr(CaseCount));
| | | +------------------------+
2453 | | +--+ if(MainF->CloseReqF){ |
| | | +--+---------------------+
| | | | +----------+
2454 | | | +--+ return; |
| | | | +----------+
| | | +-+---+
2455 | | | | } |
| | | +-----+
| | +-+---+
2456 | | | } |
| | +-----+
2457 | +--- UnRollDoRefValBits = 0;
2458 | +--- idx2 = CaseIdx-1;
| | +----------------------------------------------+
2459 | +--+ for(int kk = DoValCount-1 ; kk >= 0 ; kk--){ |
| | +--+-------------------------------------------+
2460 | | +--- c = (variedToValue[kk] - variedFromValue[kk] + 1);
2461 | | +--- UnrollCount[kk] = (idx2 % c)+1;
| | | +--------------------------+
2462 | | +--+ if(UnrollCount[kk] > 1){ |
| | | +--+-----------------------+
2463 | | | +--- UnRollDoRefValBits |= (1 << kk); // UnRollされるDoのBits
| | | +-+---+
2464 | | | | } |
| | | +-----+
2465 | | +--- idx2 /= c;
| | +-+---+
2466 | | | } |
| | +-----+
2467 | +--- //
2468 | | // 宣言部分
2469 | | //
2470 | +--- s = "";
| | +--------------------------------------------+
2471 | +--+ for(i = 0 ; i < ArgValList->Count ; i++){ |
| | +--+-----------------------------------------+
| | | +------------------------------------+
2472 | | +--+ if(ArgValList->Strings[i] == ""){ |
| | | +--+---------------------------------+
| | | | +------------+
2473 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2474 | | | | } |
| | | +-----+
| | | +--------------+
2475 | | +--+ if(s != ""){ |
| | | +--+-----------+
2476 | | | +--- s += ", ";
| | | +-+---+
2477 | | | | } |
| | | +-----+
2478 | | +--- ValData = (TValData *)ArgValList->Objects[i];
2479 | | +--- s += ValData->Str;
| | +-+---+
2480 | | | } |
| | +-----+
2481 | +--- s2.printf(" subroutine %s_%d(%s)",FuncName,CaseIdx,s.c_str());
2482 | +--- fprintf(fp,"%s\n",SepLongStr(s2).c_str());
2483 | |
2484 | +--- //
2485 | | // 使用される引数の定義を出力する。
2486 | | // DefPosS,E,ArrayDefPosS,Eを使用する。
2487 | | // DefPosSが同じ変数は、1つにまとめること。
2488 | | //
2489 | +--- DefPosS = -1;
2490 | +--- s = "";
| | +--------------------------------------------+
2491 | +--+ for(i = 0 ; i < ArgValList->Count ; i++){ |
| | +--+-----------------------------------------+
| | | +------------------------------------+
2492 | | +--+ if(ArgValList->Strings[i] == ""){ |
| | | +--+---------------------------------+
| | | | +------------+
2493 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2494 | | | | } |
| | | +-----+
2495 | | +--- ValData = (TValData *)ArgValList->Objects[i];
| | | +--------------------------------------------------------------------+
2496 | | +--+ if((DefPosS == -1)||(ValData->DefPosS != DefPosS)){ // 違う定義行 |
| | | +--+-----------------------------------------------------------------+
| | | | +--------------+
2497 | | | +--+ if(s != ""){ |
| | | | +--+-----------+
2498 | | | | +--- // fprintf(fp,"%s\n",s.c_str());
2499 | | | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
2500 | | | | +--- s = "";
| | | | +-+---+
2501 | | | | | } |
| | | | +-----+
2502 | | | +--- s = GetDefStr(ValData);
| | | | +--------------+
2503 | | | +--+ if(s == ""){ |
| | | | +--+-----------+
| | | | | +------------+
2504 | | | | +--+ continue; |
| | | | | +------------+
| | | | +-+---+
2505 | | | | | } |
| | | | +-----+
2506 | | | +--- DefPosS = ValData->DefPosS;
| | | +-+---+
2507 | | | | } |
| | | +-+---+
| | | +-+-------+
2507 | | | | else{ |
| | | +-+-------+
2508 | | | +--- s += ",";
| | | +-+---+
2509 | | | | } |
| | | +-----+
2510 | | +--- s += " " + ValData->Str;
| | | +--------------------------------------------------------------------+
2511 | | +--+ for(j = ValData->ArrayDefPosS ; j < ValData->ArrayDefPosE ; j++){ |
| | | +--+-----------------------------------------------------------------+
2512 | | | +--- Token = (TToken *)TokenList->Items[j];
2513 | | | +--- s += Token->OrgStr;
| | | +-+---+
2514 | | | | } |
| | | +-----+
| | +-+---+
2515 | | | } |
| | +-----+
| | +--------------+
2516 | +--+ if(s != ""){ |
| | +--+-----------+
2517 | | +--- // fprintf(fp,"%s\n",s.c_str());
2518 | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
2519 | | +--- s = "";
| | +-+---+
2520 | | | } |
| | +-----+
2521 | +--- //
2522 | | // 引数以外の変数の変数宣言を追加する。
2523 | | // DO変数は対象外。DO依存変数は、名前を変えて複数にする。
2524 | | //
2525 | +--- DefPosS = -1;
2526 | +--- s = "";
2527 | +--- ValDefStr = "";
| | +--------------------------------------------+
2528 | +--+ for(i = 0 ; i < ArgValList->Count ; i++){ |
| | +--+-----------------------------------------+
| | | +----------------------------------------------------------+
2529 | | +--+ if(ArgValList->Strings[i] != ""){ // 引数の変数は対象外 |
| | | +--+-------------------------------------------------------+
| | | | +------------+
2530 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2531 | | | | } |
| | | +-----+
2532 | | +--- ValData = (TValData *)ArgValList->Objects[i];
| | | +------------------------------------------+
2533 | | +--+ if(ValData->DefPosS == -1){ // 定義なし |
| | | +--+---------------------------------------+
| | | | +------------+
2534 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2535 | | | | } |
| | | +-----+
| | | +----------------------------------------------------+
2536 | | +--+ if(ValData->DefPosS != DefPosS){ // 違う定義行 |
| | | +--+-------------------------------------------------+
| | | | +--------------+
2537 | | | +--+ if(s != ""){ |
| | | | +--+-----------+
2538 | | | | +--- // fprintf(fp,"%s\n",s.c_str());
2539 | | | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
2540 | | | | +--- s = "";
| | | | +-+---+
2541 | | | | | } |
| | | | +-----+
| | | | +----------------------------------------------------------+
2542 | | | +--+ for(j = ValData->DefPosS ; j < ValData->DefPosE ; j++){ |
| | | | +--+-------------------------------------------------------+
2543 | | | | +--- Token = (TToken *)TokenList->Items[j];
2544 | | | | +--- s += Token->OrgStr;
| | | | +-+---+
2545 | | | | | } |
| | | | +-----+
2546 | | | +--- DefPosS = ValData->DefPosS;
2547 | | | +--- ValDefStr = s;
| | | +-+---+
2548 | | | | } |
| | | +-+---+
| | | +-+-------+
2548 | | | | else{ |
| | | +-+-------+
| | | | +--------------+
2549 | | | +--+ if(s == ""){ |
| | | | +--+-----------+
2550 | | | | +--- s = ValDefStr;
| | | | +-+---+
2551 | | | | | } |
| | | | +-+---+
| | | | +-+-------+
2551 | | | | | else{ |
| | | | +-+-------+
2552 | | | | +--- s += ",";
| | | | +-+---+
2553 | | | | | } |
| | | | +-----+
2554 | | | +--- // s += ",";
| | | +-+---+
2555 | | | | } |
| | | +-----+
| | | +--------------------------------------------------------+
2556 | | +--+ if((ValData->RefDoValBits & UnRollDoRefValBits) == 0){ |
| | | +--+-----------------------------------------------------+
2557 | | | +--- // UnrollするDo変数の束縛を受けない変数。
| | | | +--------------+
2558 | | | +--+ if(s == ""){ |
| | | | +--+-----------+
2559 | | | | +--- s = ValDefStr;
| | | | +-+---+
2560 | | | | | } |
| | | | +-----+
2561 | | | +--- s += " " + ValData->Str;
| | | | +--------------------------------------------------------------------+
2562 | | | +--+ for(j = ValData->ArrayDefPosS ; j < ValData->ArrayDefPosE ; j++){ |
| | | | +--+-----------------------------------------------------------------+
2563 | | | | +--- Token = (TToken *)TokenList->Items[j];
2564 | | | | +--- s += Token->OrgStr;
| | | | +-+---+
2565 | | | | | } |
| | | | +-----+
| | | +-+---+
2566 | | | | } |
| | | +-+---+
| | | +-+-------+
2566 | | | | else{ |
| | | +-+-------+
2567 | | | +--- //
2568 | | | | // Do依存変数は、N個に多重化する。
2569 | | | | // これは、どのDo変数に依存しているかによってUnroll数が
2570 | | | | // 変化するので、それに合わせての形となる。
2571 | | | | // 束縛されているDo変数における、もっとも大きい数?
2572 | | | | //
2573 | | | +--- RollCount = GetValCountOfBit(ValData->RefDoValBits & UnRollDoRefValBits,UnrollCount);
| | | | +--------------------------------------------+
2574 | | | +--+ for(iusw = 1; iusw <= RollCount ; iusw++){ |
| | | | +--+-----------------------------------------+
| | | | | +----------------------+
2575 | | | | +--+ if((iusw % 4) == 1){ |
| | | | | +--+-------------------+
| | | | | | +------------------------------------------+
2576 | | | | | +--+ if(iusw == 1){ // 4変数ごとに改行する。 |
| | | | | | +--+---------------------------------------+
2577 | | | | | | +--- s = ValDefStr + " " + ValData->Str;
| | | | | | +-+---+
2578 | | | | | | | } |
| | | | | | +-+---+
| | | | | | +-+-------+
2578 | | | | | | | else{ |
| | | | | | +-+-------+
2579 | | | | | | +--- // if(ValDefStr[1] == '\n'){ // 改行コードの処理変更 2009/02/24
| | | | | | | +--------------------------------+
2580 | | | | | | +--+ if(ValDefStr.Pos("\n") != 0){ |
| | | | | | | +--+-----------------------------+
2581 | | | | | | | +--- // fprintf(fp,"%s",s.c_str());
2582 | | | | | | | +--- fprintf(fp,"%s",SepLongStr(s).c_str());
| | | | | | | +-+---+
2583 | | | | | | | | } |
| | | | | | | +-+---+
| | | | | | | +-+-------+
2583 | | | | | | | | else{ |
| | | | | | | +-+-------+
2584 | | | | | | | +--- // fprintf(fp,"%s\n",s.c_str());
2585 | | | | | | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
| | | | | | | +-+---+
2586 | | | | | | | | } |
| | | | | | | +-----+
2587 | | | | | | +--- s = ValDefStr + " " + GetNewValName(ValData->Str,iusw,ArgValList);
| | | | | | +-+---+
2588 | | | | | | | } |
| | | | | | +-----+
| | | | | +-+---+
2589 | | | | | | } |
| | | | | +-+---+
| | | | | +-+-------+
2589 | | | | | | else{ |
| | | | | +-+-------+
2590 | | | | | +--- s += ", " + GetNewValName(ValData->Str,iusw,ArgValList);
| | | | | +-+---+
2591 | | | | | | } |
| | | | | +-----+
| | | | | +--------------------------------------------------------------------+
2592 | | | | +--+ for(j = ValData->ArrayDefPosS ; j < ValData->ArrayDefPosE ; j++){ |
| | | | | +--+-----------------------------------------------------------------+
2593 | | | | | +--- Token = (TToken *)TokenList->Items[j];
2594 | | | | | +--- s += Token->OrgStr;
| | | | | +-+---+
2595 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
2596 | | | | | } |
| | | | +-----+
| | | | +--------------+
2597 | | | +--+ if(s != ""){ |
| | | | +--+-----------+
2598 | | | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
2599 | | | | +--- s = "";
| | | | +-+---+
2600 | | | | | } |
| | | | +-----+
| | | +-+---+
2601 | | | | } |
| | | +-----+
| | +-+---+
2602 | | | } |
| | +-----+
| | +--------------+
2603 | +--+ if(s != ""){ |
| | +--+-----------+
2604 | | +--- // fprintf(fp,"%s\n",s.c_str());
2605 | | +--- fprintf(fp,"%s\n",SepLongStr(s).c_str());
2606 | | +--- s = "";
| | +-+---+
2607 | | | } |
| | +-----+
2608 | +--- fprintf(fp,"\n");
2609 | |
2610 | +--- //
2611 | | // コードを出力する。基本的に範囲をトークンでスキャンして動く。
2612 | | // 必要に応じて文字列の置き換えや、必要コードのセットを行う。
2613 | | // 行単位で処理する。
2614 | | // 複数のDOに対応するために、スクリプトでの処理となる。
2615 | | // Doの出現順は、順番(ネスト)になっている(コンパイルエラーなし)
2616 | | // よって、DoValIdx = 0,1... 1, 0 の順に処理される。
2617 | | //
2618 | +--- DoValIdx = 0;
2619 | +--- // 共有変数 UnRollDoRefValBitsは、UnRollの深さごとにSet/Reset
2620 | +--- UnRollDoRefValBits = 0;
| | +----------------------------------------------------------------+
2621 | +--+ for(TokPos = TokenStartPos ; TokPos < TokenEndPos ; TokPos++){ |
| | +--+-------------------------------------------------------------+
2622 | | +--- Token = (TToken *)TokenList->Items[TokPos];
2623 | | +--- s = Token->OrgStr;
| | | +----------------------------+
2624 | | +--+ if(Token->Script != NULL){ |
| | | +--+-------------------------+
2625 | | | +--- // スクリプトは、Skip
| | | | +------------+
2626 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2627 | | | | } |
| | | +-+---+
| | | +-+-------------------------------------------------------------------------+
2627 | | | | else if((Token->TokId == tid_Comment1)||(Token->TokId == tid_Comment2)){ |
| | | +-+-------------------------------------------------------------------------+
2628 | | | +--- fprintf(fp,"%s",Token->OrgStr); // コメントは、そのまま
| | | | +------------+
2629 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2630 | | | | } |
| | | +-+---+
| | | +-+---------------------------------------+
2630 | | | | else if(Token->TokId == tid_LineEnd){ |
| | | +-+---------------------------------------+
| | | | +--------------------------+
2631 | | | +--+ if(Token->OrgStr != ""){ |
| | | | +--+-----------------------+
2632 | | | | +--- fprintf(fp,"\n"); // 改行も、そのまま
| | | | +-+---+
2633 | | | | | } |
| | | | +-----+
| | | | +------------+
2634 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2635 | | | | } |
| | | +-+---+
| | | +-+-----------------------+
2635 | | | | else if(CaseIdx == 1){ |
| | | +-+-----------------------+
2636 | | | +--- // UnRollなしの場合は、そのまま出力
2637 | | | +--- s = "";
| | | | +------------------------------------------+
2638 | | | +--+ for( ; TokPos < TokenEndPos ; TokPos++){ |
| | | | +--+---------------------------------------+
2639 | | | | +--- Token = (TToken *)TokenList->Items[TokPos];
2640 | | | | +--- s += Token->OrgStr;
| | | | | +----------------------------------+
2641 | | | | +--+ if(Token->TokId == tid_LineEnd){ |
| | | | | +--+-------------------------------+
| | | | | | +--------+
2642 | | | | | +--+ break; |
| | | | | | +--------+
| | | | | +-+---+
2643 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
2644 | | | | | } |
| | | | +-----+
2645 | | | +--- // fprintf(fp,"%s",s.c_str());
2646 | | | +--- fprintf(fp,"%s",SepLongStr(s).c_str());
| | | | +------------+
2647 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
2648 | | | | } |
| | | +-----+
2649 | | +--- //
2650 | | | // UnRool対象のDo変数を含む式およびDOブロックの多重化コードを出力する。
2651 | | | // ブロックの場合は、ブロック終了まで解析をSkipする。
2652 | | | // かなりの、引数を渡すことになるので、クラスで共有する形とする。
2653 | | | // DoRefValBitsは、多重化対象をクリアした形で渡され、内部でさらに
2654 | | | // OR が行われる形で使用されることになる。
2655 | | | // 多重化数(cc)の回数のブロックまたは行に多重化する。
2656 | | | // RollCount = 1の場合もあるが、そのままのブロック・行となる。
2657 | | | //
| | | +------------------------------+
2658 | | +--+ if(Token->TokId == tid_DO){ |
| | | +--+---------------------------+
2659 | | | +--- // DOのブロックを出力(END_DO,Moduloの処理まで行う)
2660 | | | | // ここで行った多重化をマスクした DoRefValBitsを渡す。
2661 | | | +--- EndTokPos = OutputUnroll_DoBlock(fp,TokPos,0,0);
| | | +-+---+
2662 | | | | } |
| | | +-+---+
| | | +-+---------------------------------+
2662 | | | | else if(Token->TokId == tid_IF){ |
| | | +-+---------------------------------+
2663 | | | +--- // IFのブロックを出力 if .. endifが対象
2664 | | | +--- EndTokPos = OutputUnroll_IfBlock(fp,TokPos,0,0);
| | | +-+---+
2665 | | | | } |
| | | +-+---+
| | | +-+---------------------------------+
2665 | | | | else if(Token->ValData != NULL){ |
| | | +-+---------------------------------+
2666 | | | +--- // 1行を出力
2667 | | | +--- EndTokPos = OutputUnroll_Line(fp,TokPos,0,0);
| | | +-+---+
2668 | | | | } |
| | | +-+---+
| | | +-+-------+
2668 | | | | else{ |
| | | +-+-------+
2669 | | | +--- // DO,IF,代入文以外
2670 | | | +--- int j;
2671 | | | +--- s = "";
| | | | +------------------------------------------+
2672 | | | +--+ for(j = TokPos ; j < TokenEndPos ; j++){ |
| | | | +--+---------------------------------------+
2673 | | | | +--- Token = (TToken *)TokenList->Items[j];
2674 | | | | +--- s += Token->OrgStr;
| | | | | +----------------------------------+
2675 | | | | +--+ if(Token->TokId == tid_LineEnd){ |
| | | | | +--+-------------------------------+
| | | | | | +--------+
2676 | | | | | +--+ break; |
| | | | | | +--------+
| | | | | +-+---+
2677 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
2678 | | | | | } |
| | | | +-----+
2679 | | | +--- // fprintf(fp,"%s",s.c_str());
2680 | | | +--- fprintf(fp,"%s",SepLongStr(s).c_str());
2681 | | | +--- EndTokPos = j;
| | | +-+---+
2682 | | | | } |
| | | +-----+
2683 | | +--- TokPos = EndTokPos;
| | +-+---+
2684 | | | } |
| | +-----+
2685 | +--- fprintf(fp,"\n");
2686 | +--- fprintf(fp," return\n");
2687 | +--- fprintf(fp," end\n");
2688 | +--- fprintf(fp,"\n");
2689 | +--- fprintf(fp,"\n");
2690 | +--- // サブルーチン終了(Case回繰り返される)
| +-+---+
2691 | | } |
| +-----+
+-+---+
2692 | } |
+-----+