インラインアセンブラでの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