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/sha.h> 3655714Skris 3759191Skris#define sha1_block_x86 sha1_block_asm_data_order 3855714Skrisextern "C" { 3955714Skrisvoid sha1_block_x86(SHA_CTX *ctx, unsigned char *buffer,int num); 4055714Skris} 4155714Skris 4255714Skrisvoid main(int argc,char *argv[]) 4355714Skris { 4455714Skris unsigned char buffer[64*256]; 4555714Skris SHA_CTX ctx; 4655714Skris unsigned long s1,s2,e1,e2; 4755714Skris unsigned char k[16]; 4855714Skris unsigned long data[2]; 4955714Skris unsigned char iv[8]; 5055714Skris int i,num=0,numm; 5155714Skris int j=0; 5255714Skris 5355714Skris if (argc >= 2) 5455714Skris num=atoi(argv[1]); 5555714Skris 5655714Skris if (num == 0) num=16; 5755714Skris if (num > 250) num=16; 5855714Skris numm=num+2; 5959191Skris#if 0 6055714Skris num*=64; 6155714Skris numm*=64; 6259191Skris#endif 6355714Skris 6455714Skris for (j=0; j<6; j++) 6555714Skris { 6655714Skris for (i=0; i<10; i++) /**/ 6755714Skris { 6855714Skris sha1_block_x86(&ctx,buffer,numm); 6955714Skris GetTSC(s1); 7055714Skris sha1_block_x86(&ctx,buffer,numm); 7155714Skris GetTSC(e1); 7255714Skris GetTSC(s2); 7355714Skris sha1_block_x86(&ctx,buffer,num); 7455714Skris GetTSC(e2); 7555714Skris sha1_block_x86(&ctx,buffer,num); 7655714Skris } 7755714Skris 7859191Skris printf("sha1 (%d bytes) %d %d (%.2f)\n",num*64, 7955714Skris e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2); 8055714Skris } 8155714Skris } 8255714Skris 83