减少 while 循环中的指令

Reducing instructions in while loop

所以我有这段代码:

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

而且我想用 Assembly 编写它。

假设寄存器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: ...

是否可以减少此代码?

是的。我们重新安排循环在底部退出,条件分支:

    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: ...

虽然这是相同数量的指令,但其中一条——无条件分支——不再在循环内。


接下来,我们可以将循环转换为使用指针,如下所示:

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

这将删除循环内的索引计算。