インライン アセンブリを使用する関数があります。
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 に対して関数が常に呼び出されるようにコードを変更することはできません。