Сокращение инструкций во время цикла - PullRequest
1 голос
/ 04 марта 2020

Итак, у меня есть этот кусок кода:

i=0; while(arr[i] != value) { i = i+1; }

, и я хочу написать его в ассемблере.

Предположим, что регистр x20 содержит переменную i, регистр x21 - значение переменной и зарегистрировать x22 адрес массива. Также для простоты нет необходимости проверять, находится ли значение внутри массива.

Код:

    add x22, x0, x0 # i =0

loop: Condition code # Retrieving arr[i] and storing it into register x10

    beq x10, x21, exit # Comparing arr[i] to value

    addi x22, x22, 1 # i = i+1

j loop.

exit: ...

Возможно ли уменьшить этот код?

1 Ответ

1 голос
/ 04 марта 2020

Да. Мы переставляем l oop для выхода снизу, с условной ветвью:

    add x22, x0, x0 # i =0
    j loopStart
loop: Condition code # Retrieving arr[i] and storing it into register x10
    addi x22, x22, 1 # i = i+1
loopStart:
    sll x11, x22, 2
    add x11, x22, x11
    lw x10, 0(x11)
    bne x10, x21, loop # Comparing arr[i] to value

exit: ...

Хотя это то же самое количество команд, одна - безусловная ветвь - больше не находится внутри l oop.


Далее мы можем преобразовать l oop в указатели следующим образом:

p=arr; 
while (*p != value) p++; 
i=p-arr;

Это удалит вычисление индексации внутри l oop.

...