155714Skris// 255714Skris// gettsc.inl 355714Skris// 455714Skris// gives access to the Pentium's (secret) cycle counter 555714Skris// 655714Skris// This software was written by Leonard Janke (janke@unixg.ubc.ca) 755714Skris// in 1996-7 and is entered, by him, into the public domain. 855714Skris 955714Skris#if defined(__WATCOMC__) 1055714Skrisvoid GetTSC(unsigned long&); 1155714Skris#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax]; 1255714Skris#elif defined(__GNUC__) 1355714Skrisinline 1455714Skrisvoid GetTSC(unsigned long& tsc) 1555714Skris{ 1655714Skris asm volatile(".byte 15, 49\n\t" 1755714Skris : "=eax" (tsc) 1855714Skris : 1955714Skris : "%edx", "%eax"); 2055714Skris} 2155714Skris#elif defined(_MSC_VER) 2255714Skrisinline 2355714Skrisvoid GetTSC(unsigned long& tsc) 2455714Skris{ 2555714Skris unsigned long a; 2655714Skris __asm _emit 0fh 2755714Skris __asm _emit 31h 2855714Skris __asm mov a, eax; 2955714Skris tsc=a; 3055714Skris} 3155714Skris#endif 3255714Skris 3355714Skris#include <stdio.h> 3455714Skris#include <stdlib.h> 3555714Skris#include <openssl/md5.h> 3655714Skris 3755714Skrisextern "C" { 3855714Skrisvoid md5_block_x86(MD5_CTX *ctx, unsigned char *buffer,int num); 3955714Skris} 4055714Skris 4155714Skrisvoid main(int argc,char *argv[]) 4255714Skris { 4355714Skris unsigned char buffer[64*256]; 4455714Skris MD5_CTX ctx; 4555714Skris unsigned long s1,s2,e1,e2; 4655714Skris unsigned char k[16]; 4755714Skris unsigned long data[2]; 4855714Skris unsigned char iv[8]; 4955714Skris int i,num=0,numm; 5055714Skris int j=0; 5155714Skris 5255714Skris if (argc >= 2) 5355714Skris num=atoi(argv[1]); 5455714Skris 5555714Skris if (num == 0) num=16; 5655714Skris if (num > 250) num=16; 5755714Skris numm=num+2; 5855714Skris num*=64; 5955714Skris numm*=64; 6055714Skris 6155714Skris for (j=0; j<6; j++) 6255714Skris { 6355714Skris for (i=0; i<10; i++) /**/ 6455714Skris { 6555714Skris md5_block_x86(&ctx,buffer,numm); 6655714Skris GetTSC(s1); 6755714Skris md5_block_x86(&ctx,buffer,numm); 6855714Skris GetTSC(e1); 6955714Skris GetTSC(s2); 7055714Skris md5_block_x86(&ctx,buffer,num); 7155714Skris GetTSC(e2); 7255714Skris md5_block_x86(&ctx,buffer,num); 7355714Skris } 7455714Skris printf("md5 (%d bytes) %d %d (%.2f)\n",num, 7555714Skris e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2); 7655714Skris } 7755714Skris } 7855714Skris 79