ZHCUAQ1F july 2015 – april 2023
汇编优化器假设存储器操作不存在组冲突。如果确定两个存储器操作在任何循环迭代上都存在组冲突,则不 会并行调度操作。汇编优化器仅检查其尝试软件流水线的那些循环的存储器组冲突。
存储器组分析所需的信息指示基址、偏移、跨度、宽度和迭代增量。宽度由存储器访问类型隐式确定。迭代增量由汇编优化器在为软件流水线构建调度时确定。基址、偏移和跨度由 load 和 store 指令和/或 .mptr 指令提供。
通过使用 .mptr 指令,线性汇编中的 LD(B/BU)(H/HU)(W) 或 ST(B/H/W) 操作可以隐式具有与其关联的存储器组信息。.mptr 指令将寄存器与允许汇编优化器自动确定两个存储器操作是否存在组冲突的信息相关联。如果汇编优化器确定两个存储器操作存在存储器组冲突,则不会在软件流水线循环中并行调度这两个操作。语法为:
.mptr variable , base + offset , stride |
例如:
.mptr a_0,a+0,16
.mptr a_4,a+4,16
LDW *a_0++[4], val1 ; base=a, offset=0, stride=16
LDW *a_4++[4], val2 ; base=a, offset=4, stride=16
.mptr dptr,D+0,8
LDH *dptr++, d0 ; base=D, offset=0, stride=8
LDH *dptr++, d1 ; base=D, offset=2, stride=8
LDH *dptr++, d2 ; base=D, offset=4, stride=8
LDH *dptr++, d3 ; base=D, offset=6, stride=8
在此示例中,每次存储器访问后 dptr 的偏移都会更新。仅当指针被常量修改时,偏移才会更新。在前/后递增/递减寻址模式下,会发生此操作。
有关更多信息,请参阅 .mptr 主题。
Example5-6 显示了从正在进行软件流水线的循环中提取的加载和存储。