各位高手帮忙看一下吧,有关线性汇编的问题,谢谢啦
基本的C程序如下,实现的功能为读取length长度的value数据,寻找最大值,将其其存至value数据的第一个数。为冒泡排序的一部分。
void Sorting(UInt8 value[], int length)
{
int cntr;
UInt8 maxValue;
maxValue = value[0];
for (cntr = 1; cntr < length; cntr++)
{
if (value[cntr] > maxValue)
{
maxValue = value[cntr];
}
}
value[0] = maxValue;
}
线性汇编程序为:
.sect ".text:_sortingASMNew"
.global _sortingASMNew
_sortingASMNew: .cproc value, length
.no_mdep
.reg tempvalue, absvalue, maxvalue
.reg cntr, ifvalue, addr, tempmax
length, cntr
MV value, addr
LDB *addr++, maxvalue
ABS maxvalue, maxvalue
MV maxvalue, tempmax
LOOP: .trip 100
LDB.D1 *addr++, tempvalue
CMPGT.L1 maxvalue, tempvalue , ifvalue
NOP
[ifvalue] MV.L1 tempvalue, maxvalue
[cntr] ADD.L2 -1, cntr, cntr
[cntr] B.S2 LOOP
STB maxvalue, *value++
.endproc
在循环中,.L1单元使用了两次 ,所以最小迭代间隔为2
我希望能将最小迭代间隔变为1,想到的方法有两种
(1) MV指令也可以使用.S和.D运算单元,将线性汇编中[ifvalue] MV.L1 tempvalue, maxvalue语句变为[ifvalue] MV.S1 tempvalue, maxvalue希望使最小迭代间隔变为1。但是查看相关的.asm文件,获得的流水信息和loop kernel的信息此语句并没有使用.S1运算单元,仍然使用的.L1运算单元,不知道为什么?
(2) 使用MPY指令代替MV运算指令,使用.M1,将线性汇编中[ifvalue] MV.L1 tempvalue, maxvalue语句变为[ifvalue] MPY.M1 tempvalue, 1, maxvalue希望能使用.M1运算单元,使最小迭代间隔变为1。但是查看相关的.asm文件,A side使用了2个.X交叉通路,最小迭代间隔反而变成了3,不知道这里的交叉通路是怎么造成的?
想问一下各路高手这个问题怎么解决的,谢谢啦!
附件是相关图和更加详细的编译信息,供参考