2004年12月2日木曜日

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

匿名 2004年12月2日 9:54  

こうする必要があるんか分からんけど,
これだと普通のC関数内でも, インラインアセンブラ内でもどっちでも使えるんやんな?
いいかもね~.

匿名 2004年12月2日 18:08  

同じようなコードを何度も書く必要に迫られるときがあるんすよ。でも関数にはしたくないと。
言われてみればCでも使えるっぽいね

匿名 2004年12月3日 9:14  

普通にTAGつけてGOTOじゃだめなん?(^_^;

匿名 2004年12月3日 18:57  

gotoした先からのreturnはどうするんだよー
分岐は嫌(w

匿名 2004年12月4日 2:31  

スタックだろ?

匿名 2004年12月4日 12:36  

インラインアセンブラっすね...いつのまにか忘れてた(笑)
許して!

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP