説明
ループ本体のコピーを複数作成することによりループを変換します。
ループの誘導変数は、ループが実行する反復回数を指定します。ループ本体内のロジック (たとえば、break やループの終了変数の変更) は、反復回数に影響します。RTL では、ループ本体を表すロジック ブロックがループをインプリメントします。このロジックは同じ反復回数だけ実行されます。
syn.directive.unroll コマンドを使用すると、ループの部分展開または完全展開が可能です。ループを完全に展開すると、ループの反復回数と同じ数のループ本体のコピーが RTL に作成されます。係数 N でループを部分展開すると、ループ本体のコピーが N 個作成され、ループ反復数が調整されます。
部分展開の係数 N が元のループの反復回数の整数倍でない場合は、各ループ本体の展開済みフラグメントの後に、元の終了条件を確認してください。
ループを完全に展開するには、ループの境界がコンパイル時に認識される必要があります。これは部分展開には必要ありません。
構文
syn.directive.unroll=[OPTIONS] <location>
-
<location>: 展開するループの場所をformat function[/label]の形式で指定します。
オプション
-
factor=<integer> - 以外の整数値を指定して、部分展開が実行されるようにします。
ループ本文は、ここで指定した回数分繰り返され、それに応じて反復回数が調整されます。
-
skip_exit_check - -factor を指定した場合 (部分展開) にのみ有効です。
- 固定境界
反復回数が係数の倍数である場合、終了条件チェックは実行されません。
反復回数が係数の整数倍でない場合は、次のようになります。
- 展開は実行されません。
- 処理を続行するには終了チェックを実行する必要があることを示す警告メッセージが表示されます。
- 可変境界
終了条件チェックが削除されます。次を確認してください。
- 可変境界が係数の整数倍である。
- 終了チェックが不要である。
- 固定境界
-
off=true - 指定されたループの展開を無効にします。
例
関数 foo 内のループ L1 を展開します。プラグマは L1 の本体に記述します。
syn.directive.unroll=foo/L1
関数 foo のループ L2 の展開係数を 4 に指定します。最終チェックを削除します。プラグマは L2 の本体に記述します。
syn.directive.unroll=skip_exit_check factor=4 foo/L2