#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にしてください。 |
|
値: _asm mov eax,data\ MMX_REGISTER_PUSH32(mm,eax)\ _asm movq tempmm,tinpo\ _asm paddd mm,tempmm
md5_vc_mmx.h の 120 行で定義されています。 |
|
値: f(temp,x,y,z)\ _asm paddd temp,data\ _asm paddd w,temp
md5_vc_mmx.h の 77 行で定義されています。 |
|
値: _asm movq d,y\ _asm pxor d,z\ _asm pand d,x\ _asm pxor d,z
md5_vc_mmx.h の 44 行で定義されています。 |
|
md5_vc_mmx.h の 50 行で定義されています。 |
|
値: _asm movq d,y\ _asm pxor d,z\ _asm pxor d,x
md5_vc_mmx.h の 53 行で定義されています。 |
|
値: _asm movq d,z\ _asm pandn d,mm5\ _asm por d,x\ _asm pxor d,y
md5_vc_mmx.h の 62 行で定義されています。 |
|
値: _asm movq d,w\ _asm psllq d,s\ _asm psrlq w,32-s\ _asm por d,w
md5_vc_mmx.h の 85 行で定義されています。 |
|
値: _asm movq d,a\ _asm pslld d,s\ _asm psrld a,32-s\ _asm por d,a md5_vc_mmx.h の 91 行で定義されています。 |
|
値: 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
md5_vc_mmx.h の 98 行で定義されています。 |
|
|
|
|
|
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 }
|
|
md5_vc_mmx.h の 105 行で定義されています。 00105 { 00106 ULARGE_INTEGER inte; 00107 inte.LowPart = a; 00108 inte.HighPart = b; 00109 return inte.QuadPart; 00110 }
|
|
md5_vc_mmx.h の 111 行で定義されています。 00112 { 00113 ULARGE_INTEGER inte; 00114 inte.QuadPart = s; 00115 *a = inte.LowPart; 00116 *b = inte.HighPart; 00117 00118 }
|