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