2

オーディオ コーデックのいくつかの asm レベル (いくつかの DSP エクステンションを使用した MIPS) の最適化を実行しようとしています。関係する DSP 処理がいくつかあります。その後、結果を配列に格納する必要があります。これが私がそれを行うべきだと思ったコードです:

asm(
    eDSP_MFLO(8, 1) // move the accumulated result to $8
    "sw $8, %0\n"   // result => array
    : "=m"(s[i])
    :: "$8"
);

問題は、「メモリ」をクロバーリストに追加しない限り、周囲のコードに応じて、このコードが機能するかどうかです (機能しない場合は配列にジャンクが入ります)。

asm(
    eDSP_MFLO(8, 1) // move the accumulated result to $8
    "sw $8, %0\n"   // result => array element s[i]
    : "=m"(s[i])
    :: "$8", "memory"
);

なぜそれが必要なのか理解に苦しむ。asmブロックの配列へのオフセットを自分で計算して、どのメモリアドレスが変更されたかをコンパイラが認識できないようにしても、疑問にはなりませんが、GCCはこれらの手順を単独で実行しているため、追加の「メモリ」が必要になるのはなぜですか「クロバー?

4

1 に答える 1

1

関数全体の生成されたアセンブリ コードを、"memory"制約ありとなしの両方で見てください ( を使用gcc -S ...)。s[i]ステートメントの前にメモリからロードされたレジスタにgcc のコピーがあるように見えますが、制約を追加しない限りasm()、ステートメントの後にそのレジスタに古い情報が含まれていることを認識しません。asm()"memory"

于 2012-09-13T20:40:36.743 に答える