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