2
我正在嘗試對音頻編解碼器進行一些asm級別(MIPS,一些DSP擴展)優化。之後有一些DSP處理涉及到結果需要存儲回數組中。以下是我認爲它應該這樣做代碼:爲什麼在使用數組元素作爲GCC內聯asm中的輸出內存約束時需要指定「內存」clobber?
asm(
eDSP_MFLO(8, 1) // move the accumulated result to $8
"sw $8, %0\n" // result => array
: "=m"(s[i])
:: "$8"
);
問題是這樣的代碼工作或不(我在數組中收到垃圾時不會),根據其周圍的代碼,除非我加上「記憶「到clobber名單:
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自己正在執行這些步驟,爲什麼它需要額外的「內存「clobber?
's'是什麼類型? –
long s [SBLIMIT] – tomdz