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