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/cast.h>
3655714Skris
3755714Skrisvoid main(int argc,char *argv[])
3855714Skris	{
3955714Skris	CAST_KEY key;
4055714Skris	unsigned long s1,s2,e1,e2;
4155714Skris	unsigned long data[2];
4255714Skris	int i,j;
4355714Skris	static unsigned char d[16]={0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
4455714Skris
4555714Skris	CAST_set_key(&key, 16,d);
4655714Skris
4755714Skris	for (j=0; j<6; j++)
4855714Skris		{
4955714Skris		for (i=0; i<1000; i++) /**/
5055714Skris			{
5155714Skris			CAST_encrypt(&data[0],&key);
5255714Skris			GetTSC(s1);
5355714Skris			CAST_encrypt(&data[0],&key);
5455714Skris			CAST_encrypt(&data[0],&key);
5555714Skris			CAST_encrypt(&data[0],&key);
5655714Skris			GetTSC(e1);
5755714Skris			GetTSC(s2);
5855714Skris			CAST_encrypt(&data[0],&key);
5955714Skris			CAST_encrypt(&data[0],&key);
6055714Skris			CAST_encrypt(&data[0],&key);
6155714Skris			CAST_encrypt(&data[0],&key);
6255714Skris			GetTSC(e2);
6355714Skris			CAST_encrypt(&data[0],&key);
6455714Skris			}
6555714Skris
6655714Skris		printf("cast %d %d (%d)\n",
6755714Skris			e1-s1,e2-s2,((e2-s2)-(e1-s1)));
6855714Skris		}
6955714Skris	}
7055714Skris
71