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