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

Con*_*ado 23 assembly gcc macports avx osx-lion

我正在尝试编译一个使用新英特尔处理器中存在的pclmulqdq指令的程序.我已经使用macports安装了GCC 4.6但是当我编译我的程序(使用内在的_mm_clmulepi64_si128)时,我得到了

/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such
instruction: `pclmulqdq $0, %xmm0,%xmm1'
Run Code Online (Sandbox Code Playgroud)

似乎GCC能够从instrinsic生成正确的汇编代码,但汇编程序无法识别该指令.

我已经使用macports安装了binutils,但问题仍然存在.我怎么知道哪个汇编程序gcc正在使用?XCode汇编程序可能不支持它,但binutils汇编程序应该.

小智 24

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

-q

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

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

  • 对于在升级到10.9并使用brew install gcc49之后再次遇到这种情况的人,这是要走的路.请注意,CCFLAG正好是"-Wa,-q",其中-Wa将标志传递给汇编程序,而-q是相关标志,以使其在Mavericks上运行良好. (4认同)

Con*_*ado 13

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

为了使用AVX,我不得不:

  • 使用MacPorts安装GCC;
  • 调用clang汇编程序的脚本替换本机OS X汇编程序(/ usr/bin/as).
  • 使用已安装的GCC编译程序(例如gcc-mp-4.7)

奇怪的是,虽然clang汇编程序支持AVX,但clang编译器无法识别AVX instrinsics,迫使上面的丑陋的解决方法.