【发布时间】:2014-10-29 20:37:22
【问题描述】:
如果我想向程序员公开一条特定于机器的指令,有两种方法可以做到:
- 定义一个新的内置/内在
- 暴露与内联汇编 asm() 相同[作为单一算术类型指令,我认为不需要 asm volatile()]
我已经读过内置函数允许编译器处理类型检查、寄存器分配和“其他优化”等。但是即使在 asm() 的情况下编译器也需要这样做,对吗?那么对于单个指令使用intrinsic over asm() 的性能优势究竟是什么?
如果涉及多条机器指令,等式如何变化?
支持内在的“可移植性”论点是可以理解的,但我很想了解一个相对于另一个的性能优势(如果有的话)。
【问题讨论】:
-
对于单个指令,我怀疑会有明显的差异。
-
内置。 GCC 将您的内联汇编逐字粘贴到代码流中,它对内联汇编所做的唯一分析是您放置的寄存器约束的可行性。这意味着如果指令在给定情况下更优化,则没有机会将指令转换为其他内容,或者如果可以证明指令无用,则将其删除。
-
内联汇编适用于当您比编译器更了解并希望它不碍事的情况下,以便您可以按照您想要的顺序在寄存器上准确执行您想要的指令你要。这通常是个坏主意。
标签: c gcc assembly compiler-construction inline-assembly