我正在尝试对音频编解码器进行一些 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"
);
问题是这段代码是否有效(当它没有时我会在数组中得到垃圾),这取决于它的周围代码,除非我将“内存”添加到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 自己执行这些步骤,为什么它需要额外的“内存“破烂?