我正在尝试编译一个使用新英特尔处理器中存在的pclmulqdq指令的程序。我已经使用macports安装了GCC 4.6但是当我编译我的程序(使用内在的_mm_clmulepi64_si128)时,我得到了
/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such
instruction: `pclmulqdq $0, %xmm0,%xmm1'
似乎GCC能够从instrinsic生成正确的汇编代码,但汇编程序无法识别该指令。
我已经使用macports安装了binutils,但问题仍然存在。我怎么知道哪个汇编程序gcc正在使用? XCode汇编程序可能不支持它,但binutils汇编程序应该。
答案 0 :(得分:24)
为我解决这个问题的一个更简单的解决方案是将-Wa,-q
添加到编译器标志中。从as
(版本1.38)的手册页:
-q
使用clang(1)集成汇编程序代替基于GNU的系统汇编程序。
-Wa
部分将它从编译器驱动程序传递给汇编程序,就像-Wl
将参数传递给链接器一样。
答案 1 :(得分:13)
Mac OS X不支持GNU汇编程序(GAS)。
为了使用AVX,我不得不:
奇怪的是,当clang汇编程序支持AVX时,clang编译器无法识别AVX instrinsics,从而迫使上面的丑陋变通方法。
答案 2 :(得分:4)
as的内置版本已过时。 (在OS X 10.8.3中)
/ usr / libexec / as / x86_64 / as -v
Apple Inc版本cctools-839,GNU汇编器版本1.38
似乎没有适用于OS X的气体版本。(参见: Installing GNU Assembler in OSX)
通过脚本hack(如Conrado PLG指出)使用clang汇编程序是一种解决方法。但是,它确实需要管理员权限并覆盖OS X捆绑的可执行文件,从而导致它被未来版本的OS X捆绑的新(但可能过时)版本覆盖。
那么有更好的解决方法吗?
如Why does cross gcc invoke native 'as'?所述,似乎可以指定使用哪个“as” - 可执行文件和标志(使用“-specs = ...”)。该问题的一个更简洁的解决方法似乎是传递正确的“-specs”标志来调用clang汇编程序。这不需要管理员权限,也不会有被OS X更新破坏的风险。有关如何执行此操作的具体细节仍有待发现(任何人?)。
如果此解决方法变得无故障且足够透明,则可能需要将这些设置用作macport gcc的默认设置(或至少是变体)(以便它支持“-march = native”等) 。有一些configure.args设置(“ - with-as = $ {prefix} / bin / as”,如https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfile所示),可以替换。
答案 3 :(得分:1)
似乎我通过使用gcc / asm语法解决了我的问题,其中asm {}函数传递了一个字符串,该字符串由用引号括起来的汇编语句组成,并用反斜杠和换行符或反斜杠分隔,并且带引号的字符串包含另一个汇编语句。
https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3
答案 4 :(得分:0)
只需使用
as --version
AVX出现在版本2.18.50的gas / binutils中。