168651Skris// 268651Skris// gettsc.inl 368651Skris// 468651Skris// gives access to the Pentium's (secret) cycle counter 568651Skris// 668651Skris// This software was written by Leonard Janke (janke@unixg.ubc.ca) 768651Skris// in 1996-7 and is entered, by him, into the public domain. 868651Skris 968651Skris#if defined(__WATCOMC__) 1068651Skrisvoid GetTSC(unsigned long&); 1168651Skris#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax]; 1268651Skris#elif defined(__GNUC__) 1368651Skrisinline 1468651Skrisvoid GetTSC(unsigned long& tsc) 1568651Skris{ 1668651Skris asm volatile(".byte 15, 49\n\t" 1768651Skris : "=eax" (tsc) 1868651Skris : 1968651Skris : "%edx", "%eax"); 2068651Skris} 2168651Skris#elif defined(_MSC_VER) 2268651Skrisinline 2368651Skrisvoid GetTSC(unsigned long& tsc) 2468651Skris{ 2568651Skris unsigned long a; 2668651Skris __asm _emit 0fh 2768651Skris __asm _emit 31h 2868651Skris __asm mov a, eax; 2968651Skris tsc=a; 3068651Skris} 3168651Skris#endif 3268651Skris 3368651Skris#include <stdio.h> 3468651Skris#include <stdlib.h> 3568651Skris#include <openssl/md4.h> 3668651Skris 3768651Skrisextern "C" { 3868651Skrisvoid md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num); 3968651Skris} 4068651Skris 4168651Skrisvoid main(int argc,char *argv[]) 4268651Skris { 4368651Skris unsigned char buffer[64*256]; 4468651Skris MD4_CTX ctx; 4568651Skris unsigned long s1,s2,e1,e2; 4668651Skris unsigned char k[16]; 4768651Skris unsigned long data[2]; 4868651Skris unsigned char iv[8]; 4968651Skris int i,num=0,numm; 5068651Skris int j=0; 5168651Skris 5268651Skris if (argc >= 2) 5368651Skris num=atoi(argv[1]); 5468651Skris 5568651Skris if (num == 0) num=16; 5668651Skris if (num > 250) num=16; 5768651Skris numm=num+2; 5868651Skris num*=64; 5968651Skris numm*=64; 6068651Skris 6168651Skris for (j=0; j<6; j++) 6268651Skris { 6368651Skris for (i=0; i<10; i++) /**/ 6468651Skris { 6568651Skris md4_block_x86(&ctx,buffer,numm); 6668651Skris GetTSC(s1); 6768651Skris md4_block_x86(&ctx,buffer,numm); 6868651Skris GetTSC(e1); 6968651Skris GetTSC(s2); 7068651Skris md4_block_x86(&ctx,buffer,num); 7168651Skris GetTSC(e2); 7268651Skris md4_block_x86(&ctx,buffer,num); 7368651Skris } 7468651Skris printf("md4 (%d bytes) %d %d (%.2f)\n",num, 7568651Skris e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2); 7668651Skris } 7768651Skris } 7868651Skris 79