如何修改程序集以获得更多参考?
How to modify assembly to get more reference?
我对组装的概念很陌生,想知道我应该如何或在哪里集中精力完成一些事情
1)modify the code above to handle vectors with 96 elements.
2)How can i know the data reference generated.
3)How can i know the instruction reference generated
向量 Y = a * X + Y。向量 X 和 Y 各包含 96 个双浮点数,分别存储在地址 Rx 和 Ry 中。双浮点数占用 8 个字节(64 位)。假设寄存器可以包含 64 位并且 CPU 可以 load/store 通过仅生成一个地址(参考)
来实现双浮点数
L.D F0, a
ADDI R4, Rx, #512 : last address to load
Loop: L.D F2, 0(Rx) : load X(i)
MUL.D F2, F2, F0 : a x X(i)
L.D F4, 0(Ry) :load Y(i)
ADD.D F4, F4, F2 : a x X(i) + Y(i)
S.D F4, 0(Ry) : store into Y(i)
ADDI Rx, Rx, #8 : increment index to X
ADDI Ry, Ry, #8 : increment index to Y
SUB R20, R4, Rx : compute bound
BNEZ R20, Loop : check if done
大约 1)
代码有一个"loop"。当R20
不为零时,BNEZ R20, Loop
指令将执行流程改为Loop:
标签后的指令。
所以你首先要搞清楚,R20
的值是怎么计算出来的,循环要执行多少次。
给你一些提示:它是接近你想要的 96 的二次方值,弄清楚它需要你理解指针(地址)算法的工作原理以及为什么关于元素大小的信息是 8 个字节很重要。
然后你可以在source里调整一个常量让它循环96次
我对组装的概念很陌生,想知道我应该如何或在哪里集中精力完成一些事情
1)modify the code above to handle vectors with 96 elements.
2)How can i know the data reference generated.
3)How can i know the instruction reference generated
向量 Y = a * X + Y。向量 X 和 Y 各包含 96 个双浮点数,分别存储在地址 Rx 和 Ry 中。双浮点数占用 8 个字节(64 位)。假设寄存器可以包含 64 位并且 CPU 可以 load/store 通过仅生成一个地址(参考)
来实现双浮点数L.D F0, a
ADDI R4, Rx, #512 : last address to load
Loop: L.D F2, 0(Rx) : load X(i)
MUL.D F2, F2, F0 : a x X(i)
L.D F4, 0(Ry) :load Y(i)
ADD.D F4, F4, F2 : a x X(i) + Y(i)
S.D F4, 0(Ry) : store into Y(i)
ADDI Rx, Rx, #8 : increment index to X
ADDI Ry, Ry, #8 : increment index to Y
SUB R20, R4, Rx : compute bound
BNEZ R20, Loop : check if done
大约 1)
代码有一个"loop"。当R20
不为零时,BNEZ R20, Loop
指令将执行流程改为Loop:
标签后的指令。
所以你首先要搞清楚,R20
的值是怎么计算出来的,循环要执行多少次。
给你一些提示:它是接近你想要的 96 的二次方值,弄清楚它需要你理解指针(地址)算法的工作原理以及为什么关于元素大小的信息是 8 个字节很重要。
然后你可以在source里调整一个常量让它循环96次