我一直在gcc / x86下使用这个小函数来快速进行int16_t的字节交换:
static inline int16_t MySwapInt16t(int16_t val)
{
__asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val));
return val;
}
...今天在浏览其他人的代码时,我看到他有类似的功能,如下所示:
static inline int16_t HisSwapInt16t(int16_t val)
{
__asm__ ("xchgb %h0, %b0" : "+Q" (val));
return val;
}
我的功能和功能(AFAICT)之间的差异是:
据我所知,两种实现方式似乎都能正常工作,但内联汇编对我来说有点黑色,所以有人可以解释一下:
答案 0 :(得分:0)
他指定“+ Q”而不是“= Q”
他在函数结尾处没有:“0”(val)子句
+
修饰符代表输入和输出操作数,因此无需添加输入列表,请检查CGG manual。
交换%h0和%b0的位置
我想这并不重要,因为xchg
指令在两个操作数之间进行内容交换。
两个实现中的一个是比另一个更好还是更快,还是它们都会等效执行?
为了找到最佳实现,我将编译两个并检查objdump
编译器如何包装这些函数,因为核心函数将是相同的单个指令。
希望这有帮助!