如何在Mac OS X上使用AVX / pclmulqdq

时间:2012-03-23 13:40:36

标签: gcc assembly osx-lion macports avx

我正在尝试编译一个使用新英特尔处理器中存在的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汇编程序应该。

5 个答案:

答案 0 :(得分:24)

为我解决这个问题的一个更简单的解决方案是将-Wa,-q添加到编译器标志中。从as(版本1.38)的手册页:

  

-q

  使用clang(1)集成汇编程序代替基于GNU的系统汇编程序。

-Wa部分将它从编译器驱动程序传递给汇编程序,就像-Wl将参数传递给链接器一样。

答案 1 :(得分:13)

Mac OS X不支持GNU汇编程序(GAS)。

为了使用AVX,我不得不:

  • 使用MacPorts安装GCC;
  • Replace the native OS X assembler(/ usr / bin / as)通过调用clang汇编程序的脚本。
  • 使用已安装的GCC编译程序(例如gcc-mp-4.7)

奇怪的是,当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中。