减少 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;
这将删除循环内的索引计算。
所以我有这段代码:
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;
这将删除循环内的索引计算。