You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
| 
								 
											10 years ago
										 
									 | 
							
								//
							 | 
						||
| 
								 | 
							
								// gettsc.inl
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// gives access to the Pentium's (secret) cycle counter
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// This software was written by Leonard Janke (janke@unixg.ubc.ca)
							 | 
						||
| 
								 | 
							
								// in 1996-7 and is entered, by him, into the public domain.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__WATCOMC__)
							 | 
						||
| 
								 | 
							
								void GetTSC(unsigned long&);
							 | 
						||
| 
								 | 
							
								#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
							 | 
						||
| 
								 | 
							
								#elif defined(__GNUC__)
							 | 
						||
| 
								 | 
							
								inline
							 | 
						||
| 
								 | 
							
								void GetTSC(unsigned long& tsc)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  asm volatile(".byte 15, 49\n\t"
							 | 
						||
| 
								 | 
							
									       : "=eax" (tsc)
							 | 
						||
| 
								 | 
							
									       :
							 | 
						||
| 
								 | 
							
									       : "%edx", "%eax");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#elif defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								inline
							 | 
						||
| 
								 | 
							
								void GetTSC(unsigned long& tsc)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  unsigned long a;
							 | 
						||
| 
								 | 
							
								  __asm _emit 0fh
							 | 
						||
| 
								 | 
							
								  __asm _emit 31h
							 | 
						||
| 
								 | 
							
								  __asm mov a, eax;
							 | 
						||
| 
								 | 
							
								  tsc=a;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif      
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <openssl/md4.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								void md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void main(int argc,char *argv[])
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									unsigned char buffer[64*256];
							 | 
						||
| 
								 | 
							
									MD4_CTX ctx;
							 | 
						||
| 
								 | 
							
									unsigned long s1,s2,e1,e2;
							 | 
						||
| 
								 | 
							
									unsigned char k[16];
							 | 
						||
| 
								 | 
							
									unsigned long data[2];
							 | 
						||
| 
								 | 
							
									unsigned char iv[8];
							 | 
						||
| 
								 | 
							
									int i,num=0,numm;
							 | 
						||
| 
								 | 
							
									int j=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (argc >= 2)
							 | 
						||
| 
								 | 
							
										num=atoi(argv[1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (num == 0) num=16;
							 | 
						||
| 
								 | 
							
									if (num > 250) num=16;
							 | 
						||
| 
								 | 
							
									numm=num+2;
							 | 
						||
| 
								 | 
							
									num*=64;
							 | 
						||
| 
								 | 
							
									numm*=64;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for (j=0; j<6; j++)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										for (i=0; i<10; i++) /**/
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
											md4_block_x86(&ctx,buffer,numm);
							 | 
						||
| 
								 | 
							
											GetTSC(s1);
							 | 
						||
| 
								 | 
							
											md4_block_x86(&ctx,buffer,numm);
							 | 
						||
| 
								 | 
							
											GetTSC(e1);
							 | 
						||
| 
								 | 
							
											GetTSC(s2);
							 | 
						||
| 
								 | 
							
											md4_block_x86(&ctx,buffer,num);
							 | 
						||
| 
								 | 
							
											GetTSC(e2);
							 | 
						||
| 
								 | 
							
											md4_block_x86(&ctx,buffer,num);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										printf("md4 (%d bytes) %d %d (%.2f)\n",num,
							 | 
						||
| 
								 | 
							
											e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 |