MD5 Optimized in MMX part7

以下のような感じのマクロでワタシのMD5テストには合格した。よって示しておこうと思う。

/**
#define MD5_VC_MMX_F1(x, y, z) (z ^ (x & (y ^ z)))
d:dest x:mm0 y:mm1 z:mm2
*/

#define MD5_VC_MMX_F1(d,x,y,z)\
_asm movq d,y\
_asm pxor d,z\
_asm pand d,x\
_asm pxor d,z

#define MD5_VC_MMX_F2(d,x, y, z) MD5_VC_MMX_F1(d,z, x, y)

///#define MD5_VC_MMX_F3(x, y, z) (x ^ y ^ z)
#define MD5_VC_MMX_F3(d,x,y,z)\
_asm movq d,y\
_asm pxor d,z\
_asm pxor d,x



///#define MD5_VC_MMX_F4(x, y, z) (y ^ (x | ~z))
/*_asm pandn z,0xFFFFFFFFFFFFFFFF\*/
#define MD5_VC_MMX_F4(d,x,y,z)\
_asm movq d,z\
_asm pandn d,mm5\
_asm por d,x\
_asm pxor d,y



/* This is the central step in the MD5 algorithm.
#define MD5_VC_MMX_STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
core rotate plus
*/

///out w
#define MD5_VC_MMX_CORE(temp,w,f,x,y,z,data)\
f(temp,x,y,z)\
_asm paddd temp,data\
_asm paddd w,temp


///out d
///w = w<<s | w>>(32-s)
#define MD5_VC_MMX_ROTATE(d,w,s)\
_asm movq d,w\
_asm psllq d,s\
_asm psrlq w,32-s\
_asm por d,w

#define MD5_VC_MMX_ROTATE2(d,a,s)\
_asm movq d,a\
_asm pslld d,s\
_asm psrld a,32-s\
_asm por d,a

///lastout w,temp
#define MD5_VC_MMX_STEP(f, w, x, y, z, data, s,temp) \
MD5_VC_MMX_CORE(temp,w,f,x,y,z,(data))\
MD5_VC_MMX_ROTATE2(temp,w,s)\
_asm paddd temp,x\
_asm movq w,temp