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

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 

dkutil_cに対してMon Jan 16 00:39:54 2006に生成されました。  doxygen 1.4.4