Particle
インラインアセンブリを使用して、一連の構造体メンバー(そのような構造体へのポインター)をいくつかのレジスターにロードしようとしています。これが私の最初の解決策です:
asm("mov %1(%0), %%edx\n"
"fld %2(%0)\n"
"fld %3(%0)\n"
"fld %4(%0)\n"
"fld %5(%0)\n"
"movups %6(%0), %%xmm1\n"
"movups %7(%0), %%xmm2\n"
"movups %8(%0), %%xmm3\n"
"movups %9(%0), %%xmm4\n"
:
: "r" (Particle),
"n" (offsetof(ptcParticle, Active)),
"n" (offsetof(ptcParticle, Size)),
"n" (offsetof(ptcParticle, Rotation)),
"n" (offsetof(ptcParticle, Time)),
"n" (offsetof(ptcParticle, TimeScale)),
"n" (offsetof(ptcParticle, Colour)),
"n" (offsetof(ptcParticle, Location)),
"n" (offsetof(ptcParticle, Velocity)),
"n" (offsetof(ptcParticle, Accel))
: "%edx", "%st", "%st(1)", "%st(2)", "%st(3)", "%xmm1", "%xmm2",
"%xmm3", "%xmm4"
);
ただし、GCCはこれらのオフセットを次のように即値リテラルとして出力するため、機能しません。
mov $0(%eax), %edx
fld $44(%eax)
fld $40(%eax)
fld $8(%eax)
fld $4(%eax)
movups $12(%eax), %xmm1
movups $28(%eax), %xmm2
movups $48(%eax), %xmm3
movups $60(%eax), %xmm4
結果として、式の後にジャンクとしてgas
扱われます。(%eax)
Error: junk `(%eax)' after expression
これは、出力のドル記号しか削除できない場合に機能します。構造体のメンバーにアクセスする方法はありますか?