23

我正在尝试编译一个使用新英特尔处理器中存在的 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 能够从内部生成正确的汇编代码,但汇编器无法识别该指令。

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

4

5 回答 5

24

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

-q

     使用 clang(1) 集成汇编器而不是基于 GNU 的系统汇编器。

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

于 2013-10-13T06:40:38.200 回答
13

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

为了使用 AVX,我必须:

奇怪的是,虽然 clang 汇编器支持 AVX,但 clang 编译器不识别 AVX 内在函数,从而强制使用上述丑陋的解决方法。

于 2012-04-13T20:31:06.183 回答
4

as 的内置版本已过时。(在 OS X 10.8.3 中)

/usr/libexec/as/x86_64/as -v

Apple Inc 版本 cctools-839,GNU 汇编器版本 1.38

似乎不存在 OS X 的 gas 版本。(请参阅: 在 OSX 中安装 GNU 汇编器

通过脚本破解使用 clang 汇编器(如 Conrado PLG 所指出的)是一种解决方法。但是,它确实需要管理员权限并覆盖 OS X 捆绑的可执行文件,从而导致它被与未来版本的 OS X 捆绑的新(但可能已过时)版本覆盖的风险。

那么有没有更好的解决方法?

如前所述,为什么 cross gcc 会调用本机“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 ),可以替换。

于 2013-05-13T18:53:36.343 回答
1

只需使用

as --version

AVX 出现在 2.18.50 版左右的 gas/binutils 中。

于 2012-03-23T15:23:25.720 回答
1

看来我通过使用 gcc / asm 语法解决了我的问题,其中 asm{} 函数传递了一个字符串,该字符串由用引号括起来的汇编语句组成,并由反斜杠和换行符或反斜杠分隔,并且带引号的字符串包含另一个汇编语句。

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3

于 2015-11-19T02:54:28.313 回答