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