假设会采用向后分支
Backward branches are assumed to be taken.
假设不会采用向前分支
Forward branches are assumed to be not taken.
以前曾经采用过的分支会再次使用
Branches that have been previously taken are taken again.
向后分支不是指后面的代码...应该是跳转指令之前 loop之后的代码...
向前分支则指的是跳转后的代码.
优化的目标既是减少跳转.符合分支预测规则,使其可以正确的被预读.
对于之前的if代码
#include <stdio.h> int main() { int a = 100; int b = 25; if (a > b) { printf(“The higher value is %d\n”, a); } else printf(“The higher value is %d\n”, b); return 0; }
|
其中的
movl -4(%ebp), %eax cmpl -8(%ebp), %eax jle .L2 movl -4(%ebp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf jmp .L3 .L2: movl -8(%ebp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf .L3:
|
之所以使用jle而非JG,就是因为编译器预测紧跟在判断后面的语句更可能被执行.而其条件是a>b, 对应的
在使用jle指令的情况下什么时候不跳转, a>b..
从而a>b情况下的代码也可以被预读.
阅读(648) | 评论(1) | 转发(0) |