ZHCUAQ1F july 2015 – april 2023
当 prolog 和 epilog 被折叠时,指令可能被推测执行,从而导致加载超出循环中显式读取的范围两端的地址。默认情况下,编译器无法推测加载,因为这可能会导致读取非法的内存位置。有时,编译器可以预测这些加载以防止过度执行。然而,这会增加寄存器的压力,并可能减少可以执行的折叠总量。
使用 --speculate_loads=n 选项时,推测阈值从默认值 0 增加到 n。当阈值为 n 时,编译器可以允许推测性地执行加载,因为它读取的内存位置在循环内显式读取的某个位置之前或之后不超过 n 个字节。如果省略 n,编译器会假定推测阈值是无限的。如需在 Code Composer Studio 中指定此值,请选中“Speculate Threshold”复选框,并将编译器选项的高级类别上的选项构建对话框中的文本框留空。
折叠序言和结语通常可以减少最小安全行程计数。如果已知的最小行程计数小于最小安全行程计数,则需要一个冗余循环。否则,必须抑制流水线。下述两个值都可以在软件流水线循环之前的注释块中找到。
;*Known Minimum Trip Count: 1
....
;*Minimum safe trip count: 7
如果最小安全行程计数大于已知的最小行程计数,强烈建议使用 --speculate_loads,不仅是为了代码大小,也是为了性能。
使用 --speculate_loads 时,必须确保潜在推测的加载不会导致非法读取。这可以通过在两个方向上根据需要使用内存垫填充数据段和/或栈来实现。给定的软件流水线循环所需的内存垫也会在该循环的注释块中提供。
;*Minimum required memory pad: 8 字节