1_条件移动指令的体系结构背景

条件移动指令的体系结构背景

微体系结构背景

相对比较新的处理器里面会有这个条件移动指令, 并且 gcc 也乐于用这条指令来替代条件跳转指令.

新的流水线的一些设计会对你生成的一些汇编代码有一些影响.

现在的处理器, 包括电脑平板手机里面, 基本上都有流水线结构. 什么叫流水线结构呢, 就是一条指令进来, 我如果通过一个周期把它运行完了, 这个时钟频率就上不去, 因为比较复杂. 所以我们一般把它们分成多个段.

为了不失一般性, 我们假设一个最经典的五级流水线. 就是指令一进来之后, 通过五段流水线, 就是五个 circle, 这个指令在第一段完成它的五分之一, 在第二段完成它的下一个五分之一......就像我们工厂里的流水线一样, 每一道手续只做一部分.

这样的好处就是, 首先你的运算频率提高, 另外处理器的吞吐率也变大, 就是你同时运行的指令数变多了.

但是这种流水线逐步增强之后也会带来一些问题. 对于条件跳转指令, 我不知道这个指令是要跳转还是不跳转, 我可能得等它到了流水线中间或者后面才知道, 那么这样一来, 这条指令之后紧接着的指令该怎么读取, 这就是个问题了, 就是我是顺着走还是说我就认为它会跳, 这个时候就蒙蔽了, 因为我不知道啊.

所以现在就是有个笨方法, 就是我一看这是个条件跳转指令, 我就等着, 等它出结果, 然后我再去跑, 当然这种做法很浪费. 还有种做法就是, 我去赌一把, 赌它是跳还是不跳, 当然如果我赌错了, 我取的这些指令全都作废重新来过.

所以条件跳转指令往往会引起一定的性能损失, 因此需要尽量消除.

那么我们怎么去消除它呢, 就是用条件转移指令.

条件转移指令的局限性

我们说过, 条件转移指令原理是我把两个分支都算一遍, 然后挑一个合适的结果. 但是问题在于, 你两个分支都算的时候, 你两个分支不能把全局变量都给改了, 你改完之后还得改回来, 这相当于又引入了一些条件判断. 这是第一个局限性.

第二个局限性就是, 表达式计算量比较大的时候就用不了了.

练习题