前言
无分支算法可以不打破CPU流水线, 提高运行效率.
试验记录
// hw.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
// 汇编版无分支取绝对值
int fnAbs(int param)
{
int iAbs = 0;
// 用内联汇编实现无分支求绝对值, 不会打破CPU流水线
// 摘录自编译器生成的反汇编代码, 原始C代码为"有符号数对-2的幂取模"
_asm {
mov eax, param ; 赋值
cdq ; 扩展符号位
// 求补对正数无效
// 求补对负数等于是取绝对值
xor eax, edx ; 取反
sub eax, edx ; 加1
mov iAbs, eax ; 出参
}
return iAbs;
}
int main(int argc, char* argv[])
{
int iTmp = 0;
for (iTmp = -100; iTmp <= 100; iTmp++) {
printf("%d = fnAbs(%d)\r\n", fnAbs(iTmp), iTmp);
}
/* run result
100 = fnAbs(-100)
99 = fnAbs(-99)
98 = fnAbs(-98)
97 = fnAbs(-97)
96 = fnAbs(-96)
95 = fnAbs(-95)
94 = fnAbs(-94)
93 = fnAbs(-93)
92 = fnAbs(-92)
91 = fnAbs(-91)
90 = fnAbs(-90)
89 = fnAbs(-89)
88 = fnAbs(-88)
87 = fnAbs(-87)
86 = fnAbs(-86)
85 = fnAbs(-85)
84 = fnAbs(-84)
83 = fnAbs(-83)
82 = fnAbs(-82)
81 = fnAbs(-81)
80 = fnAbs(-80)
79 = fnAbs(-79)
78 = fnAbs(-78)
77 = fnAbs(-77)
76 = fnAbs(-76)
75 = fnAbs(-75)
74 = fnAbs(-74)
73 = fnAbs(-73)
72 = fnAbs(-72)
71 = fnAbs(-71)
70 = fnAbs(-70)
69 = fnAbs(-69)
68 = fnAbs(-68)
67 = fnAbs(-67)
66 = fnAbs(-66)
65 = fnAbs(-65)
64 = fnAbs(-64)
63 = fnAbs(-63)
62 = fnAbs(-62)
61 = fnAbs(-61)
60 = fnAbs(-60)
59 = fnAbs(-59)
58 = fnAbs(-58)
57 = fnAbs(-57)
56 = fnAbs(-56)
55 = fnAbs(-55)
54 = fnAbs(-54)
53 = fnAbs(-53)
52 = fnAbs(-52)
51 = fnAbs(-51)
50 = fnAbs(-50)
49 = fnAbs(-49)
48 = fnAbs(-48)
47 = fnAbs(-47)
46 = fnAbs(-46)
45 = fnAbs(-45)
44 = fnAbs(-44)
43 = fnAbs(-43)
42 = fnAbs(-42)
41 = fnAbs(-41)
40 = fnAbs(-40)
39 = fnAbs(-39)
38 = fnAbs(-38)
37 = fnAbs(-37)
36 = fnAbs(-36)
35 = fnAbs(-35)
34 = fnAbs(-34)
33 = fnAbs(-33)
32 = fnAbs(-32)
31 = fnAbs(-31)
30 = fnAbs(-30)
29 = fnAbs(-29)
28 = fnAbs(-28)
27 = fnAbs(-27)
26 = fnAbs(-26)
25 = fnAbs(-25)
24 = fnAbs(-24)
23 = fnAbs(-23)
22 = fnAbs(-22)
21 = fnAbs(-21)
20 = fnAbs(-20)
19 = fnAbs(-19)
18 = fnAbs(-18)
17 = fnAbs(-17)
16 = fnAbs(-16)
15 = fnAbs(-15)
14 = fnAbs(-14)
13 = fnAbs(-13)
12 = fnAbs(-12)
11 = fnAbs(-11)
10 = fnAbs(-10)
9 = fnAbs(-9)
8 = fnAbs(-8)
7 = fnAbs(-7)
6 = fnAbs(-6)
5 = fnAbs(-5)
4 = fnAbs(-4)
3 = fnAbs(-3)
2 = fnAbs(-2)
1 = fnAbs(-1)
0 = fnAbs(0)
1 = fnAbs(1)
2 = fnAbs(2)
3 = fnAbs(3)
4 = fnAbs(4)
5 = fnAbs(5)
6 = fnAbs(6)
7 = fnAbs(7)
8 = fnAbs(8)
9 = fnAbs(9)
10 = fnAbs(10)
11 = fnAbs(11)
12 = fnAbs(12)
13 = fnAbs(13)
14 = fnAbs(14)
15 = fnAbs(15)
16 = fnAbs(16)
17 = fnAbs(17)
18 = fnAbs(18)
19 = fnAbs(19)
20 = fnAbs(20)
21 = fnAbs(21)
22 = fnAbs(22)
23 = fnAbs(23)
24 = fnAbs(24)
25 = fnAbs(25)
26 = fnAbs(26)
27 = fnAbs(27)
28 = fnAbs(28)
29 = fnAbs(29)
30 = fnAbs(30)
31 = fnAbs(31)
32 = fnAbs(32)
33 = fnAbs(33)
34 = fnAbs(34)
35 = fnAbs(35)
36 = fnAbs(36)
37 = fnAbs(37)
38 = fnAbs(38)
39 = fnAbs(39)
40 = fnAbs(40)
41 = fnAbs(41)
42 = fnAbs(42)
43 = fnAbs(43)
44 = fnAbs(44)
45 = fnAbs(45)
46 = fnAbs(46)
47 = fnAbs(47)
48 = fnAbs(48)
49 = fnAbs(49)
50 = fnAbs(50)
51 = fnAbs(51)
52 = fnAbs(52)
53 = fnAbs(53)
54 = fnAbs(54)
55 = fnAbs(55)
56 = fnAbs(56)
57 = fnAbs(57)
58 = fnAbs(58)
59 = fnAbs(59)
60 = fnAbs(60)
61 = fnAbs(61)
62 = fnAbs(62)
63 = fnAbs(63)
64 = fnAbs(64)
65 = fnAbs(65)
66 = fnAbs(66)
67 = fnAbs(67)
68 = fnAbs(68)
69 = fnAbs(69)
70 = fnAbs(70)
71 = fnAbs(71)
72 = fnAbs(72)
73 = fnAbs(73)
74 = fnAbs(74)
75 = fnAbs(75)
76 = fnAbs(76)
77 = fnAbs(77)
78 = fnAbs(78)
79 = fnAbs(79)
80 = fnAbs(80)
81 = fnAbs(81)
82 = fnAbs(82)
83 = fnAbs(83)
84 = fnAbs(84)
85 = fnAbs(85)
86 = fnAbs(86)
87 = fnAbs(87)
88 = fnAbs(88)
89 = fnAbs(89)
90 = fnAbs(90)
91 = fnAbs(91)
92 = fnAbs(92)
93 = fnAbs(93)
94 = fnAbs(94)
95 = fnAbs(95)
96 = fnAbs(96)
97 = fnAbs(97)
98 = fnAbs(98)
99 = fnAbs(99)
100 = fnAbs(100)
请按任意键继续. . .
*/
system("pause");
return 0;
}