Вопрос об арифметической эффективности архитектуры Y86 с непосредственным противовесом
Я работаю с командой в классе компьютерной архитектуры над программой 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 с константами настроек в регистрах и с использованием этих регистров. Будет ли этот метод более эффективным в данном конкретном случае? Спасибо!