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

0 ответов

Другие вопросы по тегам