インラインアセンブラでのCマクロ
インラインアセンブラでCのマクロを使いたくなることがあります。
例えば以下のようなマクロ。WORDの掛け算をします。
#define MULLWD(mmDst, mmVal, mmTmp) \
movq mmTmp, mmDst \
pmullw mmDst, mmVal \
pmulhw mmTmp, mmVal \
punpcklwd mmDst, mmTmp
で、このマクロをインラインアセンブラ中で使用します。
__asm {
......
MULLWD(mm0, mm2, mm3)
MULLWD(mm1, mm2, mm3)
......
}
しかしこれはコンパイルできません。
MULLWDマクロは以下のように解釈され、改行が抜けてしまっているからです。
#define MULLWD(mmDst, mmVal, mmTmp) movq mmTmp, mmDst pmullw mmDst, mmVal pmulhw mmTmp, mmVal punpcklwd mmDst, mmTmp
VCでは以下のように各命令の前に __asm と書くことでコンパイルできるようになります。
#define MULLWD(mmDst, mmVal, mmTmp) \
__asm movq mmTmp, mmDst \
__asm pmullw mmDst, mmVal \
__asm pmulhw mmTmp, mmVal \
__asm punpcklwd mmDst, mmTmp
6 コメント:
こうする必要があるんか分からんけど,
これだと普通のC関数内でも, インラインアセンブラ内でもどっちでも使えるんやんな?
いいかもね~.
同じようなコードを何度も書く必要に迫られるときがあるんすよ。でも関数にはしたくないと。
言われてみればCでも使えるっぽいね
普通にTAGつけてGOTOじゃだめなん?(^_^;
gotoした先からのreturnはどうするんだよー
分岐は嫌(w
スタックだろ?
インラインアセンブラっすね...いつのまにか忘れてた(笑)
許して!
コメントを投稿