3

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

これは、出力のドル記号しか削除できない場合に機能します。構造体のメンバーにアクセスする方法はありますか?

4

1 に答える 1

4

さて、私はそれを理解しました-%c演算子が必要です。私はこのヘルパーマクロを書きました:

#define DECLARE_STRUCT_OFFSET(Type, Member)     \
    [Member] "i" (offsetof(Type, Member))

そして、次のように使用します。

    asm("mov    %c[Active](%0), %%edx\n"
        "fld    %c[Size](%0)\n"
        "fld    %c[Rotation](%0)\n"
        "fld    %c[Time](%0)\n"
        "fld    %c[TimeScale](%0)\n"
        "movups %c[Colour](%0), %%xmm1\n"
        "movups %c[Location](%0), %%xmm2\n"
        "movups %c[Velocity](%0), %%xmm3\n"
        "movups %c[Accel](%0), %%xmm4\n"
        :
        : "r" (Particle),
            DECLARE_STRUCT_OFFSET(ptcParticle, Active),
            DECLARE_STRUCT_OFFSET(ptcParticle, Size),
            DECLARE_STRUCT_OFFSET(ptcParticle, Rotation),
            DECLARE_STRUCT_OFFSET(ptcParticle, Time),
            DECLARE_STRUCT_OFFSET(ptcParticle, TimeScale),
            DECLARE_STRUCT_OFFSET(ptcParticle, Colour),
            DECLARE_STRUCT_OFFSET(ptcParticle, Location),
            DECLARE_STRUCT_OFFSET(ptcParticle, Velocity),
            DECLARE_STRUCT_OFFSET(ptcParticle, Accel)
        : "%edx", "%st", "%st(1)", "%st(2)", "%st(3)", "%xmm1", "%xmm2",
            "%xmm3", "%xmm4"
    );

生成されたアセンブリは正しくなり、すべてが機能しているようです。

于 2012-12-02T10:03:16.543 に答える