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

# md5_vc_mmx.h

説明を見る。

    00001
    00013 #ifndef MD5_VC_MMX_H
    00014 #define MD5_VC_MMX_H
    00015
    00016
    00017 //#define INDEPENDENT_MD5_VC_MMX_H
    00018
    00019 #ifdef INDEPENDENT_MD5_VC_MMX_H
    00020 #include <stdio.h>
    00021 #define uint32 unsigned long
    00022 #define uint16 unsigned short
    00023 #define uint8 unsigned char
    00024
    00028 #define MMX_REGISTER_PUSH32(m,a)\
    00029     _asm    movd m,a\
    00030     _asm    punpckldq m,m
    00031 #else
    00032 #include "dkcOSIndependent.h"
    00033 #include "vc_asm_misc.h"
    00034 #endif
    00035
    00036
    00037
    00038 /* #define MD5_VC_MMX_F1(x, y, z) (x & y | ~x & z) non optimize  */
    00039
    00044 #define MD5_VC_MMX_F1(d,x,y,z)\
    00045     _asm movq d,y\
    00046     _asm pxor d,z\
    00047     _asm pand d,x\
    00048     _asm pxor d,z
    00049
    00050 #define MD5_VC_MMX_F2(d,x, y, z) MD5_VC_MMX_F1(d,z, x, y)
    00051
    00053 #define MD5_VC_MMX_F3(d,x,y,z)\
    00054     _asm movq d,y\
    00055     _asm pxor d,z\
    00056     _asm pxor d,x
    00057
    00058
    00059
    00061     /*_asm pandn z,0xFFFFFFFFFFFFFFFF\  */
    00062 #define MD5_VC_MMX_F4(d,x,y,z)\
    00063     _asm movq d,z\
    00064     _asm pandn d,mm5\
    00065     _asm por        d,x\
    00066     _asm pxor   d,y
    00067
    00068
    00069
    00070 /* This is the central step in the MD5 algorithm.
    00071 #define MD5_VC_MMX_STEP(f, w, x, y, z, data, s) \
    00072     ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
    00073         core                                        rotate                                  plus
    00074   */
    00075
    00077 #define MD5_VC_MMX_CORE(temp,w,f,x,y,z,data)\
    00078     f(temp,x,y,z)\
    00079     _asm paddd temp,data\
    00080     _asm paddd w,temp
    00081
    00082
    00085 #define MD5_VC_MMX_ROTATE(d,w,s)\
    00086     _asm movq   d,w\
    00087     _asm psllq d,s\
    00088     _asm psrlq w,32-s\
    00089     _asm por        d,w
    00090
    00091 #define MD5_VC_MMX_ROTATE2(d,a,s)\
    00092     _asm movq d,a\
    00093     _asm pslld d,s\
    00094     _asm psrld a,32-s\
    00095     _asm por d,a
    00096
    00098 #define MD5_VC_MMX_STEP(f, w, x, y, z, data, s,temp) \
    00099     MD5_VC_MMX_CORE(temp,w,f,x,y,z,(data))\
    00100     MD5_VC_MMX_ROTATE2(temp,w,s)\
    00101     _asm paddd temp,x\
    00102     _asm movq w,temp
    00103
    00104
    00105 DKC_INLINE uint64 MD5_VC_MMX_UINT32_TO_UINT64(uint32 a,uint32 b){
    00106     ULARGE_INTEGER inte;
    00107     inte.LowPart = a;
    00108     inte.HighPart = b;
    00109     return inte.QuadPart;
    00110 }
    00111 DKC_INLINE void MD5_VC_MMX_UINT64_TO_UINT32(uint64 s,uint32 *a,uint32 *b)
    00112 {
    00113     ULARGE_INTEGER inte;
    00114     inte.QuadPart = s;
    00115     *a = inte.LowPart;
    00116     *b = inte.HighPart;
    00117
    00118 }
    00120 #define INSERT_TINPOW(mm,tempmm,tinpo,data)\
    00121     _asm mov eax,data\
    00122     MMX_REGISTER_PUSH32(mm,eax)\
    00123     _asm movq tempmm,tinpo\
    00124     _asm paddd mm,tempmm
    00125
    00126     /*_asm  mov eax,data\
    00127     _asm    movd mm6,eax\
    00128     _asm    movd mm7,eax\
    00129     _asm    punpckldq mm7,mm6\
    00130     _asm    movq mm6,tinpo\
    00131     _asm    paddd mm6,mm7 */
    00136 static DKC_INLINE void md5_mmx_double_update(
    00137     /*uint32 abcd0[4],
    00138     uint32 abcd1[4], */
    00139     uint32 *abcd0,
    00140     uint32 *abcd1,
    00141  const uint32 in0[16],
    00142  const uint32 in1[16])
    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 }
    00335
    00336 #endif