ARM指令集-更改CPSR(S位)

ARM指令集-更改CPSR(S位),arm,Arm,我想知道为什么ARM指令在默认情况下不设置CPSR(如x86),但在这些情况下必须使用S位?当说明不改变CPSR时,是否提供更好的性能?例如,ADD指令比ADD提供更好的性能?或者真正的交易是什么 我想知道为什么ARM指令在默认情况下不设置CPSR(如x86),但在这些情况下必须使用S位 这是一种选择,取决于上下文。额外的灵活性只受到程序员想象力的限制 当说明不改变CPSR时,是否提供更好的性能?例如,ADD指令比ADDS指令提供更好的性能 很可能永远不会。也就是说,对于大多数ARM CPU和指

我想知道为什么ARM指令在默认情况下不设置CPSR(如x86),但在这些情况下必须使用S位?当说明不改变CPSR时,是否提供更好的性能?例如,ADD指令比ADD提供更好的性能?或者真正的交易是什么

我想知道为什么ARM指令在默认情况下不设置CPSR(如x86),但在这些情况下必须使用S位

这是一种选择,取决于上下文。额外的灵活性只受到程序员想象力的限制

当说明不改变CPSR时,是否提供更好的性能?例如,
ADD
指令比
ADDS
指令提供更好的性能

很可能永远不会。也就是说,对于大多数ARM CPU和指令,不设置CPSR的指令不会执行得更快(更少的时钟)

或者真正的交易是什么

考虑一些“C”代码

int i, sum;
char *p = array; /* passed in */

for(i = 0, sum = 0; i < 10 ; i++)
    sum += arrary[i];

return sum;
在这种情况下,循环体很简单。但是,如果循环中没有条件,那么编译器(或汇编程序程序员)可以根据自己的喜好安排循环减量,并且仍然设置要在很久以后测试的条件。对于更复杂的逻辑以及CPU可能由于数据依赖性而暂停的情况,这一点可能更为重要。它对于条件执行也很重要

与单个指令相比,可选的“S”更多地是许多指令的一个功能


注1:有些人总是可以制作ARM CPU并执行此操作。你必须看数据表。我不知道有哪个CPU需要更多的时间来设置条件。

这是为了性能,或者可能是为了性能。如果您总是更改标志,那么您很难在没有分支的情况下在多条指令上使用一个标志,这会扰乱管道

if(a==0)
{
  b=b+1;
  c=0;
}
else
{
  b=0;
  c=c+1;
}
传统上,您必须通过分支(伪代码而不是真正的asm)来实现这一点

所以不管发生什么,你都要忍受一根树枝

但是有条件的执行

cmp a,0
addeq b,b,1
moveq c,0
addne c,c,1
movne b,0
没有分支,您只需翻阅代码,现在唯一可行的方法是1)您有一个基于标志的每个指令有条件执行的选项,2)修改标志的指令有一个不修改标志的选项

根据处理器系列/体系结构,add甚至mov都会修改标志,因此您必须同时具有条件执行和不设置标志的选项。这就是为什么arm有一个adds和一个add


我认为他们用64位体系结构解决了所有这些问题,因此可能是因为它很有趣,很酷,可能是因为它使用得不够或不值得,或者他们只是需要这四个位来将所有/部分指令保持在32位。

即使在几乎每个ALU op都是单周期的今天,如果不必重命名和协调每条指令中的标志写入,它仍然可以使无序内核的工作变得更轻松,因此注释间接排序为true。确实提供了更大的灵活性,并且在不使用时不会弄乱标志。你的例子真的很有帮助。谢谢因此,主要目的是使用条件指令而不是分支来避免管道重置,对吗?是的,他们在64位体系结构中消除了这一点,因为正如基准测试所显示的那样,没有任何性能提升。我正在研究32位ARM架构,所以我提出了这个问题。
cmp a,0
bne  notzero
  add b,b,1
  mov c,0
  b waszero
notzero:
  mov b,0
  add c,c,1
waszero:
cmp a,0
addeq b,b,1
moveq c,0
addne c,c,1
movne b,0