JAJZ034E October 2022 – July 2025 TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137
FPU: FPU から CPU へのレジスタ移動操作の前にする FPU 2p 操作
0、A、B、C
このアドバイザリは、マルチサイクル (2p) FPU 命令の後に FPU から CPU へのレジスタ転送が行われる場合に適用されます。FPU-to-CPU READ 命令ソースレジスタが 2p 命令宛先と同じである場合、2p 命令が完了する前に、読み出しは FPUレ ジスタの値となる可能性があります。これは、2p 命令がパイプラインの E3 フェーズ中に結果のデータ転送に依存するために発生します。E3フェーズでパイプライン ストールが発生した場合、結果は読み取り命令の時間内に転送されません。
このアドバイザリの影響を受ける 2p 命令は、MPYF32、ADDF32、SUBF32、および MACF32 です。FPU レジスタの読み出しの宛先は、CPU レジスタ (ACC、P、T、XAR0 ~ XAR7) で無ければいけません。レジスタの読み出しが FPU-to-FPU レジスタ転送である場合、このアドバイザリは適用されません。
次の例では、2p 命令 MPYF32 は R6H を宛先として使用します。FPU レジスタ READ MOV32 は、同じレジスタ R6H をソースとして使用し、CPU レジスタを宛先として使用します。E3パイプラインフェーズでストールが発生した場合、MOV32 は MPYF32 命令が完了する前に R6H の値を読み取ります。
問題の例:
MPYF32 R6H, R5H, R0H ; 2p FPU instruction that writes to R6H
|| MOV32 *XAR7++, R4H
F32TOUI16R R3H, R4H ; delay slot
ADDF32 R2H, R2H, R0H
|| MOV32 *--SP, R2H ; alignment cycle
MOV32 @XAR3, R6H ; FPU register read of R6H
図 3-4に、パイプラインにストールがない場合の問題のパイプライン図を示します。
図 3-4 パイプラインにストールがない場合の問題のパイプライン図図 3-5に、命令 I1の E3 スロットにストールがある場合の問題のパイプライン図を示します。
図 3-5 命令 I1 の E3 スロットにストールがある場合の問題のパイプライン図このシナリオでは、MPYF32、ADDF32、SUBF32、および MACF32 を 3p サイクル命令として扱います。命令のディレイ スロットには、3 つの NOP 命令または矛盾しない命令を配置する必要があります。
C28x コード生成ツール v.6.2.0 以降のバージョンでは、正しい命令シーケンスが生成され、アセンブリ コードのエラーが検出されます。以前のバージョンの v6.0.5 (6.0.x 分岐の場合 ) および v.6.1.2 (6.1.x 分岐の場) では、コンパイラは正しい命令シーケンスを生成しますが、アセンブラはアセンブリ コードのエラーを検出しません。
回避方法の例:
MPYF32 R6H, R5H, R0H
|| MOV32 *XAR7++, R4H ; 3p FPU instruction that writes to R6H
F32TOUI16R R3H, R4H ; delay slot
ADDF32 R2H, R2H, R0H
|| MOV32 *--SP, R2H ; delay slot
NOP ; alignment cycle
MOV32 @XAR3, R6H ; FPU register read of R6H
図 3-6に、回避方法が適用されたパイプライン図を示します。
図 3-6 回避方法が適用されたパイプライン図