Mips количество тактов и как улучшить код

Я действительно новичок в MIPS, и у меня есть эти вопросы, на которые я нашел так много несхожих ответов... если кто-то может помочь, это было бы здорово. Спасибо

Сколько тактов занимает этот код?

#Macro Instructions
li  $t0, 32         #  1 or 2 cycles ?      
                    #                lui $at, Upper 16-bits of value 
                    #                ori Rd, $at, Lower 16-bits of value
                    #                -----------------------------------
                    #                ori Rt, $0, value
                    #
                    #  Which set of instructions will be executed?


div $t2, $t2, $t0   #  41 cycles?          
                    #                bne Rt, $0,
                    #                break $0
                    #                ok: div Rs, Rt
                    #                mflo Rd

#Integer Instruction

lw  $t2, 0($t13)    #  1  cycles?
sw  $t2, 0($t3)     #  1  cycles?

Как эти 4 строки кода могут быть значительно улучшены? избегая использования макросов или...?

1 ответ

Решение
  • li $t0, 32

Этот вы можете легко проверить, разобрав ваш исполняемый файл или объектный файл. использование objdump из вашего набора инструментов MIPS с -d или же -D вариант. Я предполагаю, что ассемблер достаточно умен, чтобы не генерировать lui за такую ​​небольшую стоимость.


  • div $t2, $t2, $t0

Поскольку вы делите на степень двух (32), есть гораздо более быстрый способ сделать это: сдвиг вправо на log2(divisor) биты (то есть 5 бит):

srl $t2, $t2, 5   # if $t2 is unsigned

или же

sra $t2, $t2, 5   # if $t2 is signed
Другие вопросы по тегам