ZHCUAQ1F july 2015 – april 2023
指定行程计数值
label .trip minimum value [,maximum value[, factor]]
.trip 指令用于指定行程计数的值。trip count 指示循环迭代的次数。.trip 指令仅在过程中有效。以下是 .trip 指令参数的说明:
label | 标签表示循环的开始。这是必需参数。 |
minimum value | 循环可以迭代的最小次数。这是必需参数。默认为 1。 |
maximum value | 循环可以迭代的最大次数。maximum value 是一个可选参数。 |
因数 | 用于确定循环迭代次数的系数,以及 minimum value 和 maximum value。factor 为 2 表示循环始终执行偶数次,允许编译器展开一次;这样可以提高性能。在本示例中,循环会执行 8 的整数倍次,总数介于 8 次和 48 次之间:
|
当指定最大值时,系数是可选的。 |
如果汇编优化器无法确保行程计数足够大,无法对循环进行流水线处理以实现卓越性能,则会生成同一循环的流水线版本和非流水线版本。这使其中一个循环成为冗余循环。进行流水线处理或未进行流水线处理的循环是基于行程计数与循环可以并行执行的迭代次数的比较执行的。如果行程计数大于或等于并行迭代的次数,则执行进行流水线处理的循环;否则执行未进行流水线处理的循环。更多有关冗余循环的信息,请参阅节 4.7。
您无需为每个循环指定 .trip 指令;但是,如果您知道循环迭代了一定次数,则应使用 .trip。这通常意味着不会生成冗余循环(除非最小值确实很小),从而节省代码大小和执行时间。
如果知道循环每次调用时总是执行相同的次数,则还应定义最大值(其中最大值等于最小值)。编译器现在可以展开循环,从而提高性能。
当您使用中断灵活性选项 (--interrupt_threshold=n) 进行编译时,使用 .trip 最大值允许编译器确定循环可以执行的最大周期数。然后,编译器将该值与 --interrupt_threshold 选项给出的阈值进行比较。有关更多信息,请参阅节 3.12。
.trip 指令指出,调用 w_vecsum 例程时,循环将执行 16、24、32、40 或 48 次。
w_vecsum: .cproc ptr_a, ptr_b, ptr_c, weight, cnt
.reg ai, bi, prod, scaled_prod, ci
.no_mdep
loop: .trip 16, 48, 8
ldh *ptr_a++, ai
ldh *ptr_b++, bi
mpy weight, ai, prod
shr prod, 15, scaled_prod
add scaled_prod, bi, ci
sth ci, *ptr_c++
[cnt] sub cnt, 1, cnt
[cnt] b loop
.endproc