メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# md5_vc_mmx.h

`#include "dkcOSIndependent.h"`
`#include "vc_asm_misc.h"`

md5_vc_mmx.hのインクルード依存関係図

ソースコードを見る。

## マクロ定義
#define | MD5_VC_MMX_F1(d, x, y, z)
| define MD5_VC_MMX_F1(x, y, z) (z ^ (x & (y ^ z))) d:dest x:mm0 y:mm1 z:mm2
#define | MD5_VC_MMX_F2(d, x, y, z) MD5_VC_MMX_F1(d,z, x, y)
#define | MD5_VC_MMX_F3(d, x, y, z)
| define MD5_VC_MMX_F3(x, y, z) (x ^ y ^ z)
#define | MD5_VC_MMX_F4(d, x, y, z)
| define MD5_VC_MMX_F4(x, y, z) (y ^ (x | ~z))
#define | MD5_VC_MMX_CORE(temp, w, f, x, y, z, data)
| out w
#define | MD5_VC_MMX_ROTATE(d, w, s)
| out d w = w<<s | w>>(32-s)
#define | MD5_VC_MMX_ROTATE2(d, a, s)
#define | MD5_VC_MMX_STEP(f, w, x, y, z, data, s, temp)
| lastout w,temp
#define | INSERT_TINPOW(mm, tempmm, tinpo, data)
| out mm6 / use mm7 :
#define | tinpow mm4
#define | temp_mm mm6
## 関数
DKC_INLINE uint64 | MD5_VC_MMX_UINT32_TO_UINT64 (uint32 a, uint32 b)
DKC_INLINE void | MD5_VC_MMX_UINT64_TO_UINT32 (uint64 s, uint32 *a, uint32 *b)
static DKC_INLINE void | md5_mmx_double_update (uint32 *abcd0, uint32 *abcd1, const uint32 in0[16], const uint32 in1[16])
| mmxが使える状態かどうか各自でチェックしてください。 sizeは64にしてください。

## マクロ定義

#define INSERT_TINPOW | ( | mm,
|  | tempmm,
|  | tinpo,
|  | data |  | ) |

| 値:
    _asm mov eax,data\
        MMX_REGISTER_PUSH32(mm,eax)\
        _asm movq tempmm,tinpo\
        _asm paddd mm,tempmm
out mm6 / use mm7 : 覚え書き: MMX複雑すぎて壊れました。 md5_vc_mmx.h の 120 行で定義されています。 参照元 md5_mmx_double_update().

#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 w md5_vc_mmx.h の 77 行で定義されています。

#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_F1(x, y, z) (z ^ (x & (y ^ z))) d:dest x:mm0 y:mm1 z:mm2 md5_vc_mmx.h の 44 行で定義されています。 参照元 md5_mmx_double_update().

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

| md5_vc_mmx.h の 50 行で定義されています。 参照元 md5_mmx_double_update().

#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_F3(x, y, z) (x ^ y ^ z) md5_vc_mmx.h の 53 行で定義されています。 参照元 md5_mmx_double_update().

#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
define MD5_VC_MMX_F4(x, y, z) (y ^ (x | ~z)) md5_vc_mmx.h の 62 行で定義されています。 参照元 md5_mmx_double_update().

#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
out d w = w<<s | w>>(32-s) md5_vc_mmx.h の 85 行で定義されています。

#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
md5_vc_mmx.h の 91 行で定義されています。

#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
lastout w,temp md5_vc_mmx.h の 98 行で定義されています。 参照元 md5_mmx_double_update().

#define temp_mm mm6

| 参照元 md5_mmx_double_update().

#define tinpow mm4

| 参照元 md5_mmx_double_update().

## 関数

static DKC_INLINE void md5_mmx_double_update | ( | uint32 * | abcd0,
|  | uint32 * | abcd1,
|  | const uint32 | in0[16],
|  | const uint32 | in1[16]
| ) | `[static]`

| mmxが使える状態かどうか各自でチェックしてください。 sizeは64にしてください。 md5_vc_mmx.h の 136 行で定義されています。 参照先 INSERT_TINPOW, MD5_VC_MMX_F1, MD5_VC_MMX_F2, MD5_VC_MMX_F3, MD5_VC_MMX_F4, MD5_VC_MMX_STEP, MD5_VC_MMX_UINT32_TO_UINT64(), MD5_VC_MMX_UINT64_TO_UINT32(), temp_mm, と tinpow. 参照元 dkcMD5LoadDouble().
    00143 {
    00144     uint64 a,b,c,d;
    00145     uint64 tinpo[16];
    00146
    00147     const uint64 tempv = 0xFFFFFFFFFFFFFFFF;
    00148     int i;
    00149     uint64 *ptinpo;
    00150     //abcd[0] = MD5_VC_MMX_UINT32_TO_UINT64(1,1);
    00151
    00152     a = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[0],abcd1[0]);
    00153     b = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[1],abcd1[1]);
    00154     c = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[2],abcd1[2]);
    00155     d = MD5_VC_MMX_UINT32_TO_UINT64(abcd0[3],abcd1[3]);
    00156
    00157     for(i=0;i<16;i++){
    00158         tinpo[i] = MD5_VC_MMX_UINT32_TO_UINT64(in0[i],in1[i]);
    00159     }
    00160     ptinpo = tinpo;
    00161
    00162     __asm{
    00163
    00164     _asm    movq mm0,a
    00165     _asm    movq mm1,b
    00166     _asm    movq mm2,c
    00167     _asm    movq mm3,d
    00168     //_asm movq mm4,tinpo[3]
    00169
    00170
    00171 #define tinpow mm4
    00172 #define temp_mm mm6
    00173 //mm5 = 0xFFFFFFFFFFFFFFFF
    00174     _asm    movq mm5, tempv
    00175
    00176
    00177     mov     esi,ptinpo
    00178     //_asm movq mm4,[esi+3*8]
    00179     //[esi+0*8]
    00180
    00181
    00182     INSERT_TINPOW(tinpow,temp_mm,[esi+0*8],0xd76aa478);
    00183   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
    00184   INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] ,0xe8c7b756);
    00185     MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow , 12,temp_mm);
    00186     INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] ,0x242070db);
    00187   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
    00188     INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] ,0xc1bdceee);
    00189   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
    00190     INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xf57c0faf);
    00191   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
    00192     INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0x4787c62a);
    00193   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
    00194     INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xa8304613);
    00195   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
    00196     INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0xfd469501);
    00197   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
    00198     INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x698098d8);
    00199   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
    00200     INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0x8b44f7af);
    00201   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
    00202     INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xffff5bb1);
    00203   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
    00204     INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x895cd7be);
    00205   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
    00206     INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x6b901122);
    00207   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm0, mm1, mm2, mm3, tinpow, 7,temp_mm);
    00208     INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0xfd987193);
    00209   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm3, mm0, mm1, mm2, tinpow, 12,temp_mm);
    00210     INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xa679438e);
    00211   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm2, mm3, mm0, mm1, tinpow, 17,temp_mm);
    00212     INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0x49b40821);
    00213   MD5_VC_MMX_STEP(MD5_VC_MMX_F1, mm1, mm2, mm3, mm0, tinpow, 22,temp_mm);
    00214
    00215     INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0xf61e2562);
    00216   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
    00217   INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xc040b340);
    00218     MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
    00219     INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x265e5a51);
    00220   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
    00221     INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xe9b6c7aa);
    00222   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
    00223     INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xd62f105d);
    00224   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
    00225     INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0x02441453);
    00226   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
    00227     INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0xd8a1e681);
    00228   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
    00229     INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xe7d3fbc8);
    00230   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
    00231     INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0x21e1cde6);
    00232   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
    00233     INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xc33707d6);
    00234   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
    00235     INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0xf4d50d87);
    00236   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
    00237     INSERT_TINPOW(tinpow,temp_mm, [esi+8*8] , 0x455a14ed);
    00238   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
    00239     INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0xa9e3e905);
    00240   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm0, mm1, mm2, mm3, tinpow, 5,temp_mm);
    00241     INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] , 0xfcefa3f8);
    00242   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm3, mm0, mm1, mm2, tinpow, 9,temp_mm);
    00243     INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0x676f02d9);
    00244   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm2, mm3, mm0, mm1, tinpow, 14,temp_mm);
    00245     INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x8d2a4c8a);
    00246   MD5_VC_MMX_STEP(MD5_VC_MMX_F2, mm1, mm2, mm3, mm0, tinpow, 20,temp_mm);
    00247
    00248     INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xfffa3942);
    00249   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
    00250     INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x8771f681);
    00251   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
    00252     INSERT_TINPOW(tinpow,temp_mm,[esi+11*8] , 0x6d9d6122);
    00253   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
    00254     INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xfde5380c);
    00255   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
    00256     INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0xa4beea44);
    00257   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
    00258     INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0x4bdecfa9);
    00259   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
    00260     INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0xf6bb4b60);
    00261   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
    00262     INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xbebfbc70);
    00263   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
    00264     INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0x289b7ec6);
    00265   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
    00266     INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xeaa127fa);
    00267   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
    00268     INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0xd4ef3085);
    00269   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
    00270     INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0x04881d05);
    00271   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
    00272     INSERT_TINPOW(tinpow,temp_mm,[esi+9*8] , 0xd9d4d039);
    00273   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm0, mm1, mm2, mm3, tinpow, 4,temp_mm);
    00274     INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0xe6db99e5);
    00275   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm3, mm0, mm1, mm2, tinpow, 11,temp_mm);
    00276     INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0x1fa27cf8);
    00277   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm2, mm3, mm0, mm1, tinpow, 16,temp_mm);
    00278     INSERT_TINPOW(tinpow,temp_mm,[esi+2*8] , 0xc4ac5665);
    00279   MD5_VC_MMX_STEP(MD5_VC_MMX_F3, mm1, mm2, mm3, mm0, tinpow, 23,temp_mm);
    00280
    00281     INSERT_TINPOW(tinpow,temp_mm,[esi+0*8] , 0xf4292244);
    00282   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
    00283     INSERT_TINPOW(tinpow,temp_mm,[esi+7*8] , 0x432aff97);
    00284   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
    00285     INSERT_TINPOW(tinpow,temp_mm,[esi+14*8] , 0xab9423a7);
    00286   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
    00287     INSERT_TINPOW(tinpow,temp_mm,[esi+5*8] , 0xfc93a039);
    00288   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
    00289     INSERT_TINPOW(tinpow,temp_mm,[esi+12*8] , 0x655b59c3);
    00290   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
    00291     INSERT_TINPOW(tinpow,temp_mm,[esi+3*8] , 0x8f0ccc92);
    00292   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
    00293     INSERT_TINPOW(tinpow,temp_mm,[esi+10*8] , 0xffeff47d);
    00294   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
    00295     INSERT_TINPOW(tinpow,temp_mm,[esi+1*8] , 0x85845dd1);
    00296   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
    00297     INSERT_TINPOW(tinpow,temp_mm,[esi+8*8] , 0x6fa87e4f);
    00298   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
    00299     INSERT_TINPOW(tinpow,temp_mm,[esi+15*8] , 0xfe2ce6e0);
    00300   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
    00301     INSERT_TINPOW(tinpow,temp_mm,[esi+6*8] , 0xa3014314);
    00302   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
    00303     INSERT_TINPOW(tinpow,temp_mm,[esi+13*8] , 0x4e0811a1);
    00304   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
    00305     INSERT_TINPOW(tinpow,temp_mm,[esi+4*8] , 0xf7537e82);
    00306   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm0, mm1, mm2, mm3, tinpow, 6,temp_mm);
    00307     INSERT_TINPOW(tinpow,temp_mm,[esi+11*8], 0xbd3af235);
    00308   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm3, mm0, mm1, mm2, tinpow, 10,temp_mm);
    00309     INSERT_TINPOW(tinpow,temp_mm,[esi+2*8], 0x2ad7d2bb);
    00310   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm2, mm3, mm0, mm1, tinpow, 15,temp_mm);
    00311     INSERT_TINPOW(tinpow,temp_mm, [esi+9*8] , 0xeb86d391);
    00312   MD5_VC_MMX_STEP(MD5_VC_MMX_F4, mm1, mm2, mm3, mm0, tinpow, 21,temp_mm);
    00313
    00314
    00315     paddd mm0,a
    00316     paddd mm1,b
    00317     paddd mm2,c
    00318     paddd mm3,d
    00319     movq a,mm0
    00320     movq b,mm1
    00321     movq c,mm2
    00322     movq d,mm3
    00323
    00324
    00325     //_asm emms
    00326     }
    00327     MD5_VC_MMX_UINT64_TO_UINT32(a,&abcd0[0],&abcd1[0]);
    00328     MD5_VC_MMX_UINT64_TO_UINT32(b,&abcd0[1],&abcd1[1]);
    00329     MD5_VC_MMX_UINT64_TO_UINT32(c,&abcd0[2],&abcd1[2]);
    00330     MD5_VC_MMX_UINT64_TO_UINT32(d,&abcd0[3],&abcd1[3]);
    00331
    00332 #undef temp_mm
    00333 #undef tinpow
    00334 }

DKC_INLINE uint64 MD5_VC_MMX_UINT32_TO_UINT64 | ( | uint32 | a,
|  | uint32 | b
| ) |

| md5_vc_mmx.h の 105 行で定義されています。 参照元 md5_mmx_double_update().
    00105                                                                 {
    00106     ULARGE_INTEGER inte;
    00107     inte.LowPart = a;
    00108     inte.HighPart = b;
    00109     return inte.QuadPart;
    00110 }

DKC_INLINE void MD5_VC_MMX_UINT64_TO_UINT32 | ( | uint64 | s,
|  | uint32 * | a,
|  | uint32 * | b
| ) |

| md5_vc_mmx.h の 111 行で定義されています。 参照元 md5_mmx_double_update().
    00112 {
    00113     ULARGE_INTEGER inte;
    00114     inte.QuadPart = s;
    00115     *a = inte.LowPart;
    00116     *b = inte.HighPart;
    00117
    00118 }