其基本C语言的实现为:
1 static inline int clip3(int min, int max, int v) { 2 int ret = v; 3 if (ret < min) 4 ret = min; 5 if(ret > max) 6 ret = max; 7 return ret; 8 }
这个代码已经无法简化了,而且编译器一般来说也能生成比较优化的代码。针对x86,可以使用内联汇编来指定生成的代码,比如使用gcc的内联:
1 static inline int clip3(int min, int max, int value) { 2 int ret = value; 3 __asm__ volatile( 4 "cmp %1, %0 " 5 "cmovl %1, %0 " 6 "cmp %2, %0 " 7 "cmovg %2, %0 " 8 :"+&r"(ret) 9 :"r"(min), "r"(max)); 10 return ret; 11 }
这个代码使用4条指令完成所有操作,并且没有分支。这种方式的缺点是,不同编译器的内联形式不一样。在VS2010中,相应的内联函数为
static inline int clip3(int min, int max, int value) { _asm { mov eax, value; cmp eax, min; cmovl eax, min; cmp eax, max; cmovg eax, max; } }
这些内联代码都是没有分支的。