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"
);

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

4

1 回答 1

1

看看为整个函数生成的汇编代码,无论有没有"memory"约束(使用gcc -S ...)。看起来 gccs[i]在语句之前从内存中加载的寄存器中有一个副本asm(),并且它没有意识到该寄存器在语句之后包含过时的信息,asm()除非您添加"memory"约束。

于 2012-09-13T20:40:36.743 回答