2

インライン アセンブリを使用する関数があります。

  vec8w x86_sse_ldvwu(const vec8w* m) { 
     vec8w rd; 
     asm("movdqu %[m],%[rd]" : [rd] "=x" (rd) : [m] "xm" (*m)); 
     return rd; 
  } 

次のアセンブリ コードにコンパイルされます。

  sub    $0x1c,%esp
  mov    0x24(%esp),%eax
  movdqa (%eax),%xmm0 
  movdqu %xmm0,%xmm0
  movdqa %xmm0,(%esp)
  movdqa (%esp),%xmm0
  add    $0x1c,%esp
  ret 

コードはそれほど効率的ではありませんが、それは私の関心事ではありません。ご覧のとおり、インライン アセンブラは、%eax のアドレスから xmm0 にコピーする movdqa 命令を挿入します。問題は、ポインター vec8w* m が128 バイトにアラインされていないため、movdqa の実行時にセグ フォールトが発生することです。私の質問は、インライン アセンブラに movdqa の代わりに movdqu を使用するように指示する方法があるかどうかです (デフォルトで使用されます)。g++ の SSE 組み込み関数を使用して回避策を探してみましたが、どういうわけか xmmintrin.h ファイル (宣言する必要がある場所) に movdqu が見つかりません。残念ながら、整列された引数 m に対して関数が常に呼び出されるようにコードを変更することはできません。

4

1 に答える 1

2

あなたが探している組み込みはです_mm_loadu_si128。で定義されていemmintrin.hます。SSE2です。xmmintrin.hヘッダーには SSE(1) 命令のみが含まれます。

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_sse2_int_load.htm

_mm_loadu_si128movdqu探している命令を発行します。インラインアセンブリ関数で達成しようとしているのはまさにそのようです。(偏荷重)

于 2011-11-02T04:14:21.227 に答える