ZHCUAQ1F july 2015 – april 2023
以下是使用 .mdep 和 .no_mdep 指令的存储器别名示例。
.mdep r1、r2 指令会声明 LDW 必须在 STW 之前。在这种情况下,src 和 dst 可能指向同一个数组。
fn: .cproc dst, src, cnt
.reg tmp
.no_mdep
.mdep r1, r2
LDW *src{r1}, tmp
STW cnt, *dst{r2}
.return tmp
.endproc
这里,.mdep r2、r1 表示 STW 必须发生在 LDW 之前。由于 STW 在代码中位于 LDW 之后,因此依赖关系跨循环迭代。STW 指令写入一个值,该值可在下一次迭代时由 LDW 指令读取。在这种情况下,将创建一个 6 周期循环。
fn: .cproc dst, src, cnt
.reg tmp
.no_mdep
.mdep r2, r1
LOOP: .trip 100
LDW *src++{r1}, tmp
STW tmp, *dst++{r2}
[cnt] SUB cnt, 1, cnt
[cnt] B LOOP
.endproc
不要将存储器别名消歧与存储器组冲突的处理混为一谈。这两者看起来可能相似,因为它们都涉及存储器引用以及这些存储器引用对指令调度的影响。别名消歧属于正确性问题,组冲突属于性能问题。与组冲突相比,存储器依赖对指令调度的影响要大得多。最好将这两个主题分开。
对于易失性引用,请使用 .volatile 而不是 .mdep。