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