问题描述
我正在与y86程序的计算机体系结构类中的团队合作,以实现乘法函数imul。我们有一段有效的代码,但是我们正在努力使它尽可能高效地执行。目前,对于imul,我们的代码块如下所示:
imul:
# push all used registers to stack for preservation
pushq %rdi
pushq %rsi
pushq %r8
pushq %r9
pushq %r10
irmovq 0,%r9 # set 0 into r9
rrmovq %rdi,%r10 # preserve rdi in r10
subq %rsi,%rdi # compare rdi and rsi
rrmovq %r10,%rdi # restore rdi
jl continue # if rdi (looping value/count) less than rsi,don't swap
swap:
# swap rsi and rdi to make rdi smaller value of the two
rrmovq %rsi,%rdi
rrmovq %r10,%rsi
continue:
subq %r9,%rdi # check if rdi is zero
cmove %r9,%rax # if rdi = 0,rax = 0
je imulDone # if rdi = 0,jump to end
irmovq 1,%r8 # set 1 into r8
rrmovq %rsi,%rax # set rax equal to initial value from rsi
imulLoop:
subq %r8,%rdi # count - 1
je imulDone # if count = 0,jump to end
addq %rsi,%rax # add another instance of rsi into rax,looped adition
jmp imulLoop # restart loop
imulDone:
# pop all used registers from stack to original values and return
popq %r10
popq %r9
popq %r8
popq %rsi
popq %rdi
ret
现在,我们最好的主意是使用立即数算术指令(isubq等),而不是将带有设置常量的普通OPq指令存入寄存器并使用这些寄存器。 在特定情况下,这种方法会更有效吗?非常感谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)