inux2.6内核中unlikely和like函数的解释

//test_builtin_expect.c 
#define LIKELY(x) __builtin_expect(!!(x), 1)
#define UNLIKELY(x) __builtin_expect(!!(x), 0)

int test_likely(int x)
{
if(LIKELY(x))
{
   x = 5;
}
else
{
   x = 6;
}
  
return x;
}

int test_unlikely(int x)
{
if(UNLIKELY(x))
{
   x = 5;
}
else
{
   x = 6;
}
  
return x;
}
[lammy@localhost test_builtin_expect]$ gcc -fprofile-arcs -O2 -c test_builtin_expect.c 
[lammy@localhost test_builtin_expect]$ objdump -d test_builtin_expect.o
test_builtin_expect.o:        file format elf32-i386

Disassembly of section .text:
00000000 <test_likely>:
   0: 55                   push   %ebp
   1: 89 e5                mov    %esp,%ebp
   3: 8b 45 08             mov    0x8(%ebp),%eax
   6: 83 05 38 00 00 00 01 addl   $0x1,0x38
   d: 83 15 3c 00 00 00 00 adcl   $0x0,0x3c
14: 85 c0                test   %eax,%eax //见下面解释
16: 74 15                je     2d <test_likely+0x2d>//主要看这里(如果测试结果为0则跳转)
18: 83 05 40 00 00 00 01 addl   $0x1,0x40
1f: b8 05 00 00 00       mov    $0x5,%eax
24: 83 15 44 00 00 00 00 adcl   $0x0,0x44
2b: 5d                   pop    %ebp
2c: c3                   ret   
2d: 83 05 48 00 00 00 01 addl   $0x1,0x48
34: b8 06 00 00 00       mov    $0x6,%eax
39: 83 15 4c 00 00 00 00 adcl   $0x0,0x4c
40: 5d                   pop    %ebp
41: c3                   ret   
42: 8d b4 26 00 00 00 00 lea    0x0(%esi,%eiz,1),%esi
49: 8d bc 27 00 00 00 00 lea    0x0(%edi,%eiz,1),%edi
00000050 <test_unlikely>:
50: 55                   push   %ebp
51: 89 e5                mov    %esp,%ebp
53: 8b 55 08             mov    0x8(%ebp),%edx
56: 83 05 20 00 00 00 01 addl   $0x1,0x20
5d: 83 15 24 00 00 00 00 adcl   $0x0,0x24
64: 85 d2                test   %edx,%edx //看这里X86 test和and指令相似不过test只影响标志位,这里只有当edx中数据为0时zf才为1,其他为1,zf=0(说明不相等),下面一卷jne才会发生跳转
  66: 75 15                    jne       7d <test_unlikely+0x2d>//主要看这里(如果测试结果为1则跳转)
68: 83 05 30 00 00 00 01 addl   $0x1,0x30
6f: b8 06 00 00 00       mov    $0x6,%eax
74: 83 15 34 00 00 00 00 adcl   $0x0,0x34
7b: 5d                   pop    %ebp
7c: c3                   ret   
7d: 83 05 28 00 00 00 01 addl   $0x1,0x28
84: b8 05 00 00 00       mov    $0x5,%eax
89: 83 15 2c 00 00 00 00 adcl   $0x0,0x2c
90: 5d                   pop    %ebp
91: c3                   ret   
92: 8d b4 26 00 00 00 00 lea    0x0(%esi,%eiz,1),%esi
99: 8d bc 27 00 00 00 00 lea    0x0(%edi,%eiz,1),%edi
000000a0 <_GLOBAL__I_65535_0_test_likely>:
a0: 55                   push   %ebp
a1: 89 e5                mov    %esp,%ebp
a3: 83 ec 08             sub    $0x8,%esp
a6: c7 04 24 00 00 00 00 movl   $0x0,(%esp)
ad: e8 fc ff ff ff       call   ae <_GLOBAL__I_65535_0_test_likely+0xe>
b2: c9                   leave
b3: c3                   ret   
[lammy@localhost test_builtin_expect]$

两个函数编译生成的汇编语句所使用到的跳转指令不一样,仔细分析下会发现__builtin_expect实际上是为了满足在大多数情况不执行跳转 指令,所以__builtin_expect仅仅是告诉编译器优化,并没有改变其对真值的判断。

‍使用TEST AL,08H.若ZF=1,表示该位是0,若ZF=0,该位为1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值