23

新しいIntelプロセッサに搭載されているpclmulqdq命令を使用するプログラムをコンパイルしようとしています。macportsを使用してGCC4.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

     GNUベースのシステムアセンブラの代わりにclang(1)統合アセンブラを使用します。

この部分は、引数をリンカに渡す-Waのと同じように、コンパイラドライバからアセンブラに渡します。-Wl

于 2013-10-13T06:40:38.200 に答える
13

GNUアセンブラ(GAS)は、MacOSXではサポートされていません。

AVXを使用するには、次のことを行う必要がありました。

  • MacPortsを使用してGCCをインストールします。
  • ネイティブOSXアセンブラー(/ usr / bin / as)を、clangアセンブラーを呼び出すスクリプトに置き換えます。
  • インストールされているGCC(gcc-mp-4.7など)を使用してプログラムをコンパイルします。

奇妙なことに、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アセンブラのインストールを参照) 。

スクリプトハック(Conrado PLGによって指摘されている)を介してclangアセンブラーを使用することは、1つの回避策です。ただし、管理者権限が必要であり、OS Xにバンドルされている実行可能ファイルが上書きされるため、OS Xの将来のバージョンにバンドルされている新しい(まだ古い可能性がある)バージョンによって上書きされるリスクがあります。

それでは、より良い回避策はありますか?

に記載されているように、crossgccがネイティブの'as'を呼び出すのはなぜですか?使用する「as」実行可能ファイルとフラグを指定することは可能のようです(「-specs = ...」を使用)。この問題のよりクリーンな回避策は、正しい「-specs」フラグを渡してclangアセンブラーを呼び出すことのようです。これには管理者権限は必要なく、OSXアップデートによって破損するリスクはありません。これを実行する方法の正確な詳細はまだわかっていません(誰か?)。

この回避策が問題なく透過的になる場合は、これらの設定をmacport gccのデフォルト(または少なくともバリアント)として使用することが保証される場合があります(「-march = native」などをサポートするため)。https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfileに見られるように、configure.args設定( "--with-as = $ {prefix} / bin / as")などがあります。 )、これは置き換えることができます。

于 2013-05-13T18:53:36.343 に答える
1

使用するだけ

as --version

AVXは、gas/binutilsのバージョン2.18.50付近に登場しました。

于 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 に答える