ssl/libcrypto/src/crypto/des/des_opts.c
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /* crypto/des/des_opts.c */
       
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       
     3  * All rights reserved.
       
     4  *
       
     5  * This package is an SSL implementation written
       
     6  * by Eric Young (eay@cryptsoft.com).
       
     7  * The implementation was written so as to conform with Netscapes SSL.
       
     8  * 
       
     9  * This library is free for commercial and non-commercial use as long as
       
    10  * the following conditions are aheared to.  The following conditions
       
    11  * apply to all code found in this distribution, be it the RC4, RSA,
       
    12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
       
    13  * included with this distribution is covered by the same copyright terms
       
    14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
       
    15  * 
       
    16  * Copyright remains Eric Young's, and as such any Copyright notices in
       
    17  * the code are not to be removed.
       
    18  * If this package is used in a product, Eric Young should be given attribution
       
    19  * as the author of the parts of the library used.
       
    20  * This can be in the form of a textual message at program startup or
       
    21  * in documentation (online or textual) provided with the package.
       
    22  * 
       
    23  * Redistribution and use in source and binary forms, with or without
       
    24  * modification, are permitted provided that the following conditions
       
    25  * are met:
       
    26  * 1. Redistributions of source code must retain the copyright
       
    27  *    notice, this list of conditions and the following disclaimer.
       
    28  * 2. Redistributions in binary form must reproduce the above copyright
       
    29  *    notice, this list of conditions and the following disclaimer in the
       
    30  *    documentation and/or other materials provided with the distribution.
       
    31  * 3. All advertising materials mentioning features or use of this software
       
    32  *    must display the following acknowledgement:
       
    33  *    "This product includes cryptographic software written by
       
    34  *     Eric Young (eay@cryptsoft.com)"
       
    35  *    The word 'cryptographic' can be left out if the rouines from the library
       
    36  *    being used are not cryptographic related :-).
       
    37  * 4. If you include any Windows specific code (or a derivative thereof) from 
       
    38  *    the apps directory (application code) you must include an acknowledgement:
       
    39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
       
    40  * 
       
    41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
       
    42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
       
    45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       
    47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       
    49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       
    50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       
    51  * SUCH DAMAGE.
       
    52  * 
       
    53  * The licence and distribution terms for any publically available version or
       
    54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
       
    55  * copied and put under another distribution licence
       
    56  * [including the GNU Public Licence.]
       
    57  */
       
    58 
       
    59 /* define PART1, PART2, PART3 or PART4 to build only with a few of the options.
       
    60  * This is for machines with 64k code segment size restrictions. */
       
    61 
       
    62 #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
       
    63 #define TIMES
       
    64 #endif
       
    65 
       
    66 #include <stdio.h>
       
    67 #ifndef OPENSSL_SYS_MSDOS
       
    68 #include <openssl/e_os2.h>
       
    69 #include OPENSSL_UNISTD
       
    70 #else
       
    71 #include <io.h>
       
    72 extern void exit();
       
    73 #endif
       
    74 
       
    75 #ifndef OPENSSL_SYS_NETWARE
       
    76 #include <signal.h>
       
    77 #endif
       
    78 
       
    79 #ifndef _IRIX
       
    80 #include <time.h>
       
    81 #endif
       
    82 #ifdef TIMES
       
    83 #include <sys/types.h>
       
    84 #include <sys/times.h>
       
    85 #endif
       
    86 
       
    87 /* Depending on the VMS version, the tms structure is perhaps defined.
       
    88    The __TMS macro will show if it was.  If it wasn't defined, we should
       
    89    undefine TIMES, since that tells the rest of the program how things
       
    90    should be handled.				-- Richard Levitte */
       
    91 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
       
    92 #undef TIMES
       
    93 #endif
       
    94 
       
    95 #ifndef TIMES
       
    96 #include <sys/timeb.h>
       
    97 #endif
       
    98 
       
    99 
       
   100 #if defined(sun) || defined(__ultrix)
       
   101 #define _POSIX_SOURCE
       
   102 #include <limits.h>
       
   103 #include <sys/param.h>
       
   104 #endif
       
   105 
       
   106 #include <openssl/des.h>
       
   107 #include "spr.h"
       
   108 
       
   109 #define DES_DEFAULT_OPTIONS
       
   110 
       
   111 #if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4)
       
   112 #define PART1
       
   113 #define PART2
       
   114 #define PART3
       
   115 #define PART4
       
   116 #endif
       
   117 
       
   118 #ifdef PART1
       
   119 
       
   120 #undef DES_UNROLL
       
   121 #undef DES_RISC1
       
   122 #undef DES_RISC2
       
   123 #undef DES_PTR
       
   124 #undef D_ENCRYPT
       
   125 #define DES_encrypt1 des_encrypt_u4_cisc_idx
       
   126 #define DES_encrypt2 des_encrypt2_u4_cisc_idx
       
   127 #define DES_encrypt3 des_encrypt3_u4_cisc_idx
       
   128 #define DES_decrypt3 des_decrypt3_u4_cisc_idx
       
   129 #undef HEADER_DES_LOCL_H
       
   130 #include "des_enc.c"
       
   131 
       
   132 #define DES_UNROLL
       
   133 #undef DES_RISC1
       
   134 #undef DES_RISC2
       
   135 #undef DES_PTR
       
   136 #undef D_ENCRYPT
       
   137 #undef DES_encrypt1
       
   138 #undef DES_encrypt2
       
   139 #undef DES_encrypt3
       
   140 #undef DES_decrypt3
       
   141 #define DES_encrypt1 des_encrypt_u16_cisc_idx
       
   142 #define DES_encrypt2 des_encrypt2_u16_cisc_idx
       
   143 #define DES_encrypt3 des_encrypt3_u16_cisc_idx
       
   144 #define DES_decrypt3 des_decrypt3_u16_cisc_idx
       
   145 #undef HEADER_DES_LOCL_H
       
   146 #include "des_enc.c"
       
   147 
       
   148 #undef DES_UNROLL
       
   149 #define DES_RISC1
       
   150 #undef DES_RISC2
       
   151 #undef DES_PTR
       
   152 #undef D_ENCRYPT
       
   153 #undef DES_encrypt1
       
   154 #undef DES_encrypt2
       
   155 #undef DES_encrypt3
       
   156 #undef DES_decrypt3
       
   157 #define DES_encrypt1 des_encrypt_u4_risc1_idx
       
   158 #define DES_encrypt2 des_encrypt2_u4_risc1_idx
       
   159 #define DES_encrypt3 des_encrypt3_u4_risc1_idx
       
   160 #define DES_decrypt3 des_decrypt3_u4_risc1_idx
       
   161 #undef HEADER_DES_LOCL_H
       
   162 #include "des_enc.c"
       
   163 
       
   164 #endif
       
   165 
       
   166 #ifdef PART2
       
   167 
       
   168 #undef DES_UNROLL
       
   169 #undef DES_RISC1
       
   170 #define DES_RISC2
       
   171 #undef DES_PTR
       
   172 #undef D_ENCRYPT
       
   173 #undef DES_encrypt1
       
   174 #undef DES_encrypt2
       
   175 #undef DES_encrypt3
       
   176 #undef DES_decrypt3
       
   177 #define DES_encrypt1 des_encrypt_u4_risc2_idx
       
   178 #define DES_encrypt2 des_encrypt2_u4_risc2_idx
       
   179 #define DES_encrypt3 des_encrypt3_u4_risc2_idx
       
   180 #define DES_decrypt3 des_decrypt3_u4_risc2_idx
       
   181 #undef HEADER_DES_LOCL_H
       
   182 #include "des_enc.c"
       
   183 
       
   184 #define DES_UNROLL
       
   185 #define DES_RISC1
       
   186 #undef DES_RISC2
       
   187 #undef DES_PTR
       
   188 #undef D_ENCRYPT
       
   189 #undef DES_encrypt1
       
   190 #undef DES_encrypt2
       
   191 #undef DES_encrypt3
       
   192 #undef DES_decrypt3
       
   193 #define DES_encrypt1 des_encrypt_u16_risc1_idx
       
   194 #define DES_encrypt2 des_encrypt2_u16_risc1_idx
       
   195 #define DES_encrypt3 des_encrypt3_u16_risc1_idx
       
   196 #define DES_decrypt3 des_decrypt3_u16_risc1_idx
       
   197 #undef HEADER_DES_LOCL_H
       
   198 #include "des_enc.c"
       
   199 
       
   200 #define DES_UNROLL
       
   201 #undef DES_RISC1
       
   202 #define DES_RISC2
       
   203 #undef DES_PTR
       
   204 #undef D_ENCRYPT
       
   205 #undef DES_encrypt1
       
   206 #undef DES_encrypt2
       
   207 #undef DES_encrypt3
       
   208 #undef DES_decrypt3
       
   209 #define DES_encrypt1 des_encrypt_u16_risc2_idx
       
   210 #define DES_encrypt2 des_encrypt2_u16_risc2_idx
       
   211 #define DES_encrypt3 des_encrypt3_u16_risc2_idx
       
   212 #define DES_decrypt3 des_decrypt3_u16_risc2_idx
       
   213 #undef HEADER_DES_LOCL_H
       
   214 #include "des_enc.c"
       
   215 
       
   216 #endif
       
   217 
       
   218 #ifdef PART3
       
   219 
       
   220 #undef DES_UNROLL
       
   221 #undef DES_RISC1
       
   222 #undef DES_RISC2
       
   223 #define DES_PTR
       
   224 #undef D_ENCRYPT
       
   225 #undef DES_encrypt1
       
   226 #undef DES_encrypt2
       
   227 #undef DES_encrypt3
       
   228 #undef DES_decrypt3
       
   229 #define DES_encrypt1 des_encrypt_u4_cisc_ptr
       
   230 #define DES_encrypt2 des_encrypt2_u4_cisc_ptr
       
   231 #define DES_encrypt3 des_encrypt3_u4_cisc_ptr
       
   232 #define DES_decrypt3 des_decrypt3_u4_cisc_ptr
       
   233 #undef HEADER_DES_LOCL_H
       
   234 #include "des_enc.c"
       
   235 
       
   236 #define DES_UNROLL
       
   237 #undef DES_RISC1
       
   238 #undef DES_RISC2
       
   239 #define DES_PTR
       
   240 #undef D_ENCRYPT
       
   241 #undef DES_encrypt1
       
   242 #undef DES_encrypt2
       
   243 #undef DES_encrypt3
       
   244 #undef DES_decrypt3
       
   245 #define DES_encrypt1 des_encrypt_u16_cisc_ptr
       
   246 #define DES_encrypt2 des_encrypt2_u16_cisc_ptr
       
   247 #define DES_encrypt3 des_encrypt3_u16_cisc_ptr
       
   248 #define DES_decrypt3 des_decrypt3_u16_cisc_ptr
       
   249 #undef HEADER_DES_LOCL_H
       
   250 #include "des_enc.c"
       
   251 
       
   252 #undef DES_UNROLL
       
   253 #define DES_RISC1
       
   254 #undef DES_RISC2
       
   255 #define DES_PTR
       
   256 #undef D_ENCRYPT
       
   257 #undef DES_encrypt1
       
   258 #undef DES_encrypt2
       
   259 #undef DES_encrypt3
       
   260 #undef DES_decrypt3
       
   261 #define DES_encrypt1 des_encrypt_u4_risc1_ptr
       
   262 #define DES_encrypt2 des_encrypt2_u4_risc1_ptr
       
   263 #define DES_encrypt3 des_encrypt3_u4_risc1_ptr
       
   264 #define DES_decrypt3 des_decrypt3_u4_risc1_ptr
       
   265 #undef HEADER_DES_LOCL_H
       
   266 #include "des_enc.c"
       
   267 
       
   268 #endif
       
   269 
       
   270 #ifdef PART4
       
   271 
       
   272 #undef DES_UNROLL
       
   273 #undef DES_RISC1
       
   274 #define DES_RISC2
       
   275 #define DES_PTR
       
   276 #undef D_ENCRYPT
       
   277 #undef DES_encrypt1
       
   278 #undef DES_encrypt2
       
   279 #undef DES_encrypt3
       
   280 #undef DES_decrypt3
       
   281 #define DES_encrypt1 des_encrypt_u4_risc2_ptr
       
   282 #define DES_encrypt2 des_encrypt2_u4_risc2_ptr
       
   283 #define DES_encrypt3 des_encrypt3_u4_risc2_ptr
       
   284 #define DES_decrypt3 des_decrypt3_u4_risc2_ptr
       
   285 #undef HEADER_DES_LOCL_H
       
   286 #include "des_enc.c"
       
   287 
       
   288 #define DES_UNROLL
       
   289 #define DES_RISC1
       
   290 #undef DES_RISC2
       
   291 #define DES_PTR
       
   292 #undef D_ENCRYPT
       
   293 #undef DES_encrypt1
       
   294 #undef DES_encrypt2
       
   295 #undef DES_encrypt3
       
   296 #undef DES_decrypt3
       
   297 #define DES_encrypt1 des_encrypt_u16_risc1_ptr
       
   298 #define DES_encrypt2 des_encrypt2_u16_risc1_ptr
       
   299 #define DES_encrypt3 des_encrypt3_u16_risc1_ptr
       
   300 #define DES_decrypt3 des_decrypt3_u16_risc1_ptr
       
   301 #undef HEADER_DES_LOCL_H
       
   302 #include "des_enc.c"
       
   303 
       
   304 #define DES_UNROLL
       
   305 #undef DES_RISC1
       
   306 #define DES_RISC2
       
   307 #define DES_PTR
       
   308 #undef D_ENCRYPT
       
   309 #undef DES_encrypt1
       
   310 #undef DES_encrypt2
       
   311 #undef DES_encrypt3
       
   312 #undef DES_decrypt3
       
   313 #define DES_encrypt1 des_encrypt_u16_risc2_ptr
       
   314 #define DES_encrypt2 des_encrypt2_u16_risc2_ptr
       
   315 #define DES_encrypt3 des_encrypt3_u16_risc2_ptr
       
   316 #define DES_decrypt3 des_decrypt3_u16_risc2_ptr
       
   317 #undef HEADER_DES_LOCL_H
       
   318 #include "des_enc.c"
       
   319 
       
   320 #endif
       
   321 
       
   322 /* The following if from times(3) man page.  It may need to be changed */
       
   323 #ifndef HZ
       
   324 # ifndef CLK_TCK
       
   325 #  ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
       
   326 #   define HZ	100.0
       
   327 #  else /* _BSD_CLK_TCK_ */
       
   328 #   define HZ ((double)_BSD_CLK_TCK_)
       
   329 #  endif
       
   330 # else /* CLK_TCK */
       
   331 #  define HZ ((double)CLK_TCK)
       
   332 # endif
       
   333 #endif
       
   334 
       
   335 #define BUFSIZE	((long)1024)
       
   336 long run=0;
       
   337 
       
   338 double Time_F(int s);
       
   339 #ifdef SIGALRM
       
   340 #if defined(__STDC__) || defined(sgi)
       
   341 #define SIGRETTYPE void
       
   342 #else
       
   343 #define SIGRETTYPE int
       
   344 #endif
       
   345 
       
   346 SIGRETTYPE sig_done(int sig);
       
   347 SIGRETTYPE sig_done(int sig)
       
   348 	{
       
   349 	signal(SIGALRM,sig_done);
       
   350 	run=0;
       
   351 #ifdef LINT
       
   352 	sig=sig;
       
   353 #endif
       
   354 	}
       
   355 #endif
       
   356 
       
   357 #define START	0
       
   358 #define STOP	1
       
   359 
       
   360 double Time_F(int s)
       
   361 	{
       
   362 	double ret;
       
   363 #ifdef TIMES
       
   364 	static struct tms tstart,tend;
       
   365 
       
   366 	if (s == START)
       
   367 		{
       
   368 		times(&tstart);
       
   369 		return(0);
       
   370 		}
       
   371 	else
       
   372 		{
       
   373 		times(&tend);
       
   374 		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
       
   375 		return((ret == 0.0)?1e-6:ret);
       
   376 		}
       
   377 #else /* !times() */
       
   378 	static struct timeb tstart,tend;
       
   379 	long i;
       
   380 
       
   381 	if (s == START)
       
   382 		{
       
   383 		ftime(&tstart);
       
   384 		return(0);
       
   385 		}
       
   386 	else
       
   387 		{
       
   388 		ftime(&tend);
       
   389 		i=(long)tend.millitm-(long)tstart.millitm;
       
   390 		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
       
   391 		return((ret == 0.0)?1e-6:ret);
       
   392 		}
       
   393 #endif
       
   394 	}
       
   395 
       
   396 #ifdef SIGALRM
       
   397 #define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
       
   398 #else
       
   399 #define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
       
   400 #endif
       
   401 	
       
   402 #define time_it(func,name,index) \
       
   403 	print_name(name); \
       
   404 	Time_F(START); \
       
   405 	for (count=0,run=1; COND(cb); count++) \
       
   406 		{ \
       
   407 		unsigned long d[2]; \
       
   408 		func(d,&sch,DES_ENCRYPT); \
       
   409 		} \
       
   410 	tm[index]=Time_F(STOP); \
       
   411 	fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
       
   412 	tm[index]=((double)COUNT(cb))/tm[index];
       
   413 
       
   414 #define print_it(name,index) \
       
   415 	fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
       
   416 		tm[index]*8,1.0e6/tm[index]);
       
   417 
       
   418 int main(int argc, char **argv)
       
   419 	{
       
   420 	long count;
       
   421 	static unsigned char buf[BUFSIZE];
       
   422 	static DES_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
       
   423 	static DES_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
       
   424 	static DES_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
       
   425 	DES_key_schedule sch,sch2,sch3;
       
   426 	double d,tm[16],max=0;
       
   427 	int rank[16];
       
   428 	char *str[16];
       
   429 	int max_idx=0,i,num=0,j;
       
   430 #ifndef SIGALARM
       
   431 	long ca,cb,cc,cd,ce;
       
   432 #endif
       
   433 
       
   434 	for (i=0; i<12; i++)
       
   435 		{
       
   436 		tm[i]=0.0;
       
   437 		rank[i]=0;
       
   438 		}
       
   439 
       
   440 #ifndef TIMES
       
   441 	fprintf(stderr,"To get the most accurate results, try to run this\n");
       
   442 	fprintf(stderr,"program when this computer is idle.\n");
       
   443 #endif
       
   444 
       
   445 	DES_set_key_unchecked(&key,&sch);
       
   446 	DES_set_key_unchecked(&key2,&sch2);
       
   447 	DES_set_key_unchecked(&key3,&sch3);
       
   448 
       
   449 #ifndef SIGALRM
       
   450 	fprintf(stderr,"First we calculate the approximate speed ...\n");
       
   451 	DES_set_key_unchecked(&key,sch);
       
   452 	count=10;
       
   453 	do	{
       
   454 		long i;
       
   455 		unsigned long data[2];
       
   456 
       
   457 		count*=2;
       
   458 		Time_F(START);
       
   459 		for (i=count; i; i--)
       
   460 			DES_encrypt1(data,&(sch[0]),DES_ENCRYPT);
       
   461 		d=Time_F(STOP);
       
   462 		} while (d < 3.0);
       
   463 	ca=count;
       
   464 	cb=count*3;
       
   465 	cc=count*3*8/BUFSIZE+1;
       
   466 	cd=count*8/BUFSIZE+1;
       
   467 
       
   468 	ce=count/20+1;
       
   469 #define COND(d) (count != (d))
       
   470 #define COUNT(d) (d)
       
   471 #else
       
   472 #define COND(c) (run)
       
   473 #define COUNT(d) (count)
       
   474         signal(SIGALRM,sig_done);
       
   475         alarm(10);
       
   476 #endif
       
   477 
       
   478 #ifdef PART1
       
   479 	time_it(des_encrypt_u4_cisc_idx,  "des_encrypt_u4_cisc_idx  ", 0);
       
   480 	time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1);
       
   481 	time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2);
       
   482 	num+=3;
       
   483 #endif
       
   484 #ifdef PART2
       
   485 	time_it(des_encrypt_u16_risc1_idx,"des_encrypt_u16_risc1_idx", 3);
       
   486 	time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4);
       
   487 	time_it(des_encrypt_u16_risc2_idx,"des_encrypt_u16_risc2_idx", 5);
       
   488 	num+=3;
       
   489 #endif
       
   490 #ifdef PART3
       
   491 	time_it(des_encrypt_u4_cisc_ptr,  "des_encrypt_u4_cisc_ptr  ", 6);
       
   492 	time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7);
       
   493 	time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8);
       
   494 	num+=3;
       
   495 #endif
       
   496 #ifdef PART4
       
   497 	time_it(des_encrypt_u16_risc1_ptr,"des_encrypt_u16_risc1_ptr", 9);
       
   498 	time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ",10);
       
   499 	time_it(des_encrypt_u16_risc2_ptr,"des_encrypt_u16_risc2_ptr",11);
       
   500 	num+=3;
       
   501 #endif
       
   502 
       
   503 #ifdef PART1
       
   504 	str[0]=" 4  c i";
       
   505 	print_it("des_encrypt_u4_cisc_idx  ",0);
       
   506 	max=tm[0];
       
   507 	max_idx=0;
       
   508 	str[1]="16  c i";
       
   509 	print_it("des_encrypt_u16_cisc_idx ",1);
       
   510 	if (max < tm[1]) { max=tm[1]; max_idx=1; }
       
   511 	str[2]=" 4 r1 i";
       
   512 	print_it("des_encrypt_u4_risc1_idx ",2);
       
   513 	if (max < tm[2]) { max=tm[2]; max_idx=2; }
       
   514 #endif
       
   515 #ifdef PART2
       
   516 	str[3]="16 r1 i";
       
   517 	print_it("des_encrypt_u16_risc1_idx",3);
       
   518 	if (max < tm[3]) { max=tm[3]; max_idx=3; }
       
   519 	str[4]=" 4 r2 i";
       
   520 	print_it("des_encrypt_u4_risc2_idx ",4);
       
   521 	if (max < tm[4]) { max=tm[4]; max_idx=4; }
       
   522 	str[5]="16 r2 i";
       
   523 	print_it("des_encrypt_u16_risc2_idx",5);
       
   524 	if (max < tm[5]) { max=tm[5]; max_idx=5; }
       
   525 #endif
       
   526 #ifdef PART3
       
   527 	str[6]=" 4  c p";
       
   528 	print_it("des_encrypt_u4_cisc_ptr  ",6);
       
   529 	if (max < tm[6]) { max=tm[6]; max_idx=6; }
       
   530 	str[7]="16  c p";
       
   531 	print_it("des_encrypt_u16_cisc_ptr ",7);
       
   532 	if (max < tm[7]) { max=tm[7]; max_idx=7; }
       
   533 	str[8]=" 4 r1 p";
       
   534 	print_it("des_encrypt_u4_risc1_ptr ",8);
       
   535 	if (max < tm[8]) { max=tm[8]; max_idx=8; }
       
   536 #endif
       
   537 #ifdef PART4
       
   538 	str[9]="16 r1 p";
       
   539 	print_it("des_encrypt_u16_risc1_ptr",9);
       
   540 	if (max < tm[9]) { max=tm[9]; max_idx=9; }
       
   541 	str[10]=" 4 r2 p";
       
   542 	print_it("des_encrypt_u4_risc2_ptr ",10);
       
   543 	if (max < tm[10]) { max=tm[10]; max_idx=10; }
       
   544 	str[11]="16 r2 p";
       
   545 	print_it("des_encrypt_u16_risc2_ptr",11);
       
   546 	if (max < tm[11]) { max=tm[11]; max_idx=11; }
       
   547 #endif
       
   548 	printf("options    des ecb/s\n");
       
   549 	printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]);
       
   550 	d=tm[max_idx];
       
   551 	tm[max_idx]= -2.0;
       
   552 	max= -1.0;
       
   553 	for (;;)
       
   554 		{
       
   555 		for (i=0; i<12; i++)
       
   556 			{
       
   557 			if (max < tm[i]) { max=tm[i]; j=i; }
       
   558 			}
       
   559 		if (max < 0.0) break;
       
   560 		printf("%s %12.2f  %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0);
       
   561 		tm[j]= -2.0;
       
   562 		max= -1.0;
       
   563 		}
       
   564 
       
   565 	switch (max_idx)
       
   566 		{
       
   567 	case 0:
       
   568 		printf("-DDES_DEFAULT_OPTIONS\n");
       
   569 		break;
       
   570 	case 1:
       
   571 		printf("-DDES_UNROLL\n");
       
   572 		break;
       
   573 	case 2:
       
   574 		printf("-DDES_RISC1\n");
       
   575 		break;
       
   576 	case 3:
       
   577 		printf("-DDES_UNROLL -DDES_RISC1\n");
       
   578 		break;
       
   579 	case 4:
       
   580 		printf("-DDES_RISC2\n");
       
   581 		break;
       
   582 	case 5:
       
   583 		printf("-DDES_UNROLL -DDES_RISC2\n");
       
   584 		break;
       
   585 	case 6:
       
   586 		printf("-DDES_PTR\n");
       
   587 		break;
       
   588 	case 7:
       
   589 		printf("-DDES_UNROLL -DDES_PTR\n");
       
   590 		break;
       
   591 	case 8:
       
   592 		printf("-DDES_RISC1 -DDES_PTR\n");
       
   593 		break;
       
   594 	case 9:
       
   595 		printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n");
       
   596 		break;
       
   597 	case 10:
       
   598 		printf("-DDES_RISC2 -DDES_PTR\n");
       
   599 		break;
       
   600 	case 11:
       
   601 		printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n");
       
   602 		break;
       
   603 		}
       
   604 	exit(0);
       
   605 #if defined(LINT) || defined(OPENSSL_SYS_MSDOS)
       
   606 	return(0);
       
   607 #endif
       
   608 	}