2012-09-13 18 views
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?

+0

's'是什麼類型? –

+0

long s [SBLIMIT] – tomdz

回答

1

查看帶或不帶"memory"約束(使用gcc -S ...)的整個函數的生成彙編代碼。看起來gcc在asm()聲明之前從內存中加載了一個s[i]副本,並且它沒有認識到該註冊包含asm()聲明之後的過期信息,除非您添加"memory"約束。

相關問題