オーディオ コーデックのいくつかの 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はこれらの手順を単独で実行しているため、追加の「メモリ」が必要になるのはなぜですか「クロバー?