1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org//
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// gettsc.inl
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org//
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// gives access to the Pentium's (secret) cycle counter
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org//
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// This software was written by Leonard Janke (janke@unixg.ubc.ca)
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// in 1996-7 and is entered, by him, into the public domain.
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if defined(__WATCOMC__)
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long&);
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#elif defined(__GNUC__)
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orginline
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long& tsc)
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  asm volatile(".byte 15, 49\n\t"
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	       : "=eax" (tsc)
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	       :
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	       : "%edx", "%eax");
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#elif defined(_MSC_VER)
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orginline
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid GetTSC(unsigned long& tsc)
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  unsigned long a;
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  __asm _emit 0fh
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  __asm _emit 31h
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  __asm mov a, eax;
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org  tsc=a;
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h>
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/ripemd.h>
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define ripemd160_block_x86 ripemd160_block_asm_host_order
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgextern "C" {
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid ripemd160_block_x86(RIPEMD160_CTX *ctx, unsigned char *buffer,int num);
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid main(int argc,char *argv[])
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char buffer[64*256];
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	RIPEMD160_CTX ctx;
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned long s1,s2,e1,e2;
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char k[16];
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned long data[2];
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char iv[8];
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i,num=0,numm;
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int j=0;
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (argc >= 2)
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		num=atoi(argv[1]);
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (num == 0) num=16;
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (num > 250) num=16;
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	numm=num+2;
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 0
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	num*=64;
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	numm*=64;
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (j=0; j<6; j++)
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=0; i<10; i++) /**/
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ripemd160_block_x86(&ctx,buffer,numm);
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GetTSC(s1);
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ripemd160_block_x86(&ctx,buffer,numm);
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GetTSC(e1);
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GetTSC(s2);
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ripemd160_block_x86(&ctx,buffer,num);
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			GetTSC(e2);
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ripemd160_block_x86(&ctx,buffer,num);
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		printf("ripemd160 (%d bytes) %d %d (%.2f)\n",num*64,
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
83