为什么用1而不是-1?

时间:2013-09-08 18:26:52

标签: cpu

29分钟http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly安德烈亚历山大夫斯库说,当使用常数更喜欢0时,提到硬件知道如何处理它。我做了一些汇编,我知道他在谈论什么以及CPU上的零标志

然后他说更喜欢常数1而不是-1。 -1 IIRC实际上并不特殊,但因为它是负数,所以CPU上的符号标志将被设置。从我目前的理解中得出的1只是一个正数,处理器标志上没有位,也没有办法区分0或其他正数。

但安德烈说要优先选择1比-1。为什么?硬件用1做什么比-1更好?

1 个答案:

答案 0 :(得分:0)

首先,应该注意的是,Andrea Alexandrescu强调了零和其他两个好常数之间的区别,即使用一个和负一个之间的差异不太重要。他还将编译器问题与硬件问题捆绑在一起,即硬件可能能够有效地执行操作,但是如果在所选择的更高级语言中使用相当清晰的表达式,编译器将不会生成适当的机器代码。

虽然我无法理解他的想法,但至少有两个方面可能比一个方面更好。

  1. 许多ISA提供返回零或一(例如,MIPS设置为小于)而不是零或负数的比较操作(或GPR传输的标记)。 (SIMD指令是一个例外; SIMD比较通常会产生零或负一个[所有位设置]。)
  2. SPARC的至少一个实现使加载较小的有符号值更加昂贵,我似乎记得至少有一个ISA没有提供加载有符号字节的指令。天真的符号扩展实现会增加延迟,因为在加载值之前,是否设置或清除更重要的位是不可知的。
  3. 否定的确有一些好处。正如您所提到的,对负面性进行测试通常相对容易,因此如果负面值是唯一使用的负值,则可能会以较低的成本处理。此外,有条件地清除基于零或负值的值仅仅是and操作。 (对于有条件地设置或清除单个位,首选一个而不是负一个,因为这样只需要一个移位和and。)