1
.ident "md5-sparcv9.S, Version 1.0"
2
.ident "SPARC V9 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
6
* ====================================================================
7
* Copyright (c) 1999 Andy Polyakov <appro@fy.chalmers.se>.
9
* Rights for redistribution and usage in source and binary forms are
10
* granted as long as above copyright notices are retained. Warranty
11
* of any kind is (of course:-) disclaimed.
12
* ====================================================================
16
* This is my modest contribution to OpenSSL project (see
17
* http://www.openssl.org/ for more information about it) and is an
18
* assembler implementation of MD5 block hash function. I've hand-coded
19
* this for the sole reason to reach UltraSPARC-specific "load in
20
* little-endian byte order" instruction. This gives up to 15%
21
* performance improvement for cases when input message is aligned at
22
* 32 bits boundary. The module was tested under both 32 *and* 64 bit
23
* kernels. For updates see http://fy.chalmers.se/~appro/hpe/.
25
* To compile with SC4.x/SC5.x:
27
* cc -xarch=v[9|8plus] -DOPENSSL_SYSNAME_ULTRASPARC -DMD5_BLOCK_DATA_ORDER \
32
* gcc -mcpu=ultrasparc -DOPENSSL_SYSNAME_ULTRASPARC -DMD5_BLOCK_DATA_ORDER \
35
* or if above fails (it does if you have gas):
37
* gcc -E -DOPENSSL_SYSNAMEULTRASPARC -DMD5_BLOCK_DATA_ORDER md5_block.sparc.S | \
38
* as -xarch=v8plus /dev/fd/0 -o md5-sparcv9.o
41
#include <openssl/e_os2.h>
71
#define Aval R5 /* those not used at the end of the last round */
76
#if defined(MD5_BLOCK_DATA_ORDER)
77
/*# if defined(OPENSSL_SYSNAME_ULTRASPARC)*/
79
# define X(i) [%i1+i*4]%asi
80
# define md5_block md5_block_asm_data_order_aligned
81
# define ASI_PRIMARY_LITTLE 0x88
83
# error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!"
87
# define X(i) [%i1+i*4]
88
# define md5_block md5_block_asm_host_order
91
.section ".text",#alloc,#execinstr
93
#if defined(__SUNPRO_C) && defined(__sparcv9)
94
/* They've said -xarch=v9 at command line */
95
.register %g2,#scratch
96
.register %g3,#scratch
98
#elif defined(__GNUC__) && defined(__arch64__)
99
/* They've said -m64 at command line */
100
.register %g2,#scratch
101
.register %g3,#scratch
117
#ifdef ASI_PRIMARY_LITTLE
118
rd %asi,%o7 ! How dare I? Well, I just do:-)
119
wr %g0,ASI_PRIMARY_LITTLE,%asi
128
sethi %hi(0xd76aa478),T2
130
or T2,%lo(0xd76aa478),T2 !=
142
sethi %hi(0xe8c7b756),T2
144
or T2,%lo(0xe8c7b756),T2
156
sethi %hi(0x242070db),T2 !=
158
or T2,%lo(0x242070db),T2
170
sethi %hi(0xc1bdceee),T2
172
or T2,%lo(0xc1bdceee),T2
184
sethi %hi(0xf57c0faf),T2
186
or T2,%lo(0xf57c0faf),T2 !=
198
sethi %hi(0x4787c62a),T2
200
or T2,%lo(0x4787c62a),T2
212
sethi %hi(0xa8304613),T2 !=
214
or T2,%lo(0xa8304613),T2
226
sethi %hi(0xfd469501),T2
228
or T2,%lo(0xfd469501),T2
240
sethi %hi(0x698098d8),T2
242
or T2,%lo(0x698098d8),T2 !=
254
sethi %hi(0x8b44f7af),T2
256
or T2,%lo(0x8b44f7af),T2
268
sethi %hi(0xffff5bb1),T2 !=
270
or T2,%lo(0xffff5bb1),T2
282
sethi %hi(0x895cd7be),T2
284
or T2,%lo(0x895cd7be),T2
296
sethi %hi(0x6b901122),T2
298
or T2,%lo(0x6b901122),T2 !=
310
sethi %hi(0xfd987193),T2
312
or T2,%lo(0xfd987193),T2
324
sethi %hi(0xa679438e),T2 !=
326
or T2,%lo(0xa679438e),T2
338
sethi %hi(0x49b40821),T2
340
or T2,%lo(0x49b40821),T2
354
sethi %hi(0xf61e2562),T2
356
or T2,%lo(0xf61e2562),T2
368
sethi %hi(0xc040b340),T2
370
or T2,%lo(0xc040b340),T2
373
!pre-LOADed X(11),R11
382
sethi %hi(0x265e5a51),T2
384
or T2,%lo(0x265e5a51),T2
396
sethi %hi(0xe9b6c7aa),T2
398
or T2,%lo(0xe9b6c7aa),T2
410
sethi %hi(0xd62f105d),T2
412
or T2,%lo(0xd62f105d),T2
415
!pre-LOADed X(10),R10
424
sethi %hi(0x02441453),T2
426
or T2,%lo(0x02441453),T2
438
sethi %hi(0xd8a1e681),T2
440
or T2,%lo(0xd8a1e681),T2 !=
452
sethi %hi(0xe7d3fbc8),T2
454
or T2,%lo(0xe7d3fbc8),T2 !=
466
sethi %hi(0x21e1cde6),T2
468
or T2,%lo(0x21e1cde6),T2 !=
480
sethi %hi(0xc33707d6),T2
482
or T2,%lo(0xc33707d6),T2
494
sethi %hi(0xf4d50d87),T2
496
or T2,%lo(0xf4d50d87),T2
508
sethi %hi(0x455a14ed),T2
510
or T2,%lo(0x455a14ed),T2
513
!pre-LOADed X(13),R13
522
sethi %hi(0xa9e3e905),T2
524
or T2,%lo(0xa9e3e905),T2
536
sethi %hi(0xfcefa3f8),T2
538
or T2,%lo(0xfcefa3f8),T2
550
sethi %hi(0x676f02d9),T2
552
or T2,%lo(0x676f02d9),T2
555
!pre-LOADed X(12),R12
564
sethi %hi(0x8d2a4c8a),T2
566
or T2,%lo(0x8d2a4c8a),T2
580
sethi %hi(0xfffa3942),T2
582
or T2,%lo(0xfffa3942),T2
593
sethi %hi(0x8771f681),T2
595
or T2,%lo(0x8771f681),T2 !=
597
!pre-LOADed X(11),R11
606
sethi %hi(0x6d9d6122),T2
608
or T2,%lo(0x6d9d6122),T2
619
sethi %hi(0xfde5380c),T2
621
or T2,%lo(0xfde5380c),T2
632
sethi %hi(0xa4beea44),T2 !=
634
or T2,%lo(0xa4beea44),T2
645
sethi %hi(0x4bdecfa9),T2
647
or T2,%lo(0x4bdecfa9),T2
658
sethi %hi(0xf6bb4b60),T2
660
or T2,%lo(0xf6bb4b60),T2 !=
662
!pre-LOADed X(10),R10
671
sethi %hi(0xbebfbc70),T2
673
or T2,%lo(0xbebfbc70),T2
675
!pre-LOADed X(13),R13
684
sethi %hi(0x289b7ec6),T2 !=
686
or T2,%lo(0x289b7ec6),T2
697
sethi %hi(0xeaa127fa),T2
699
or T2,%lo(0xeaa127fa),T2
710
sethi %hi(0xd4ef3085),T2
712
or T2,%lo(0xd4ef3085),T2 !=
723
sethi %hi(0x04881d05),T2
725
or T2,%lo(0x04881d05),T2
736
sethi %hi(0xd9d4d039),T2 !=
738
or T2,%lo(0xd9d4d039),T2
740
!pre-LOADed X(12),R12
749
sethi %hi(0xe6db99e5),T2
751
or T2,%lo(0xe6db99e5),T2
762
sethi %hi(0x1fa27cf8),T2
764
or T2,%lo(0x1fa27cf8),T2
775
sethi %hi(0xc4ac5665),T2
777
or T2,%lo(0xc4ac5665),T2 !=
790
sethi %hi(0xf4292244),T2
792
or T2,%lo(0xf4292244),T2
803
sethi %hi(0x432aff97),T2 !=
805
or T2,%lo(0x432aff97),T2
816
sethi %hi(0xab9423a7),T2 !=
818
or T2,%lo(0xab9423a7),T2
829
sethi %hi(0xfc93a039),T2
831
or T2,%lo(0xfc93a039),T2
833
!pre-LOADed X(12),R12
842
sethi %hi(0x655b59c3),T2
844
or T2,%lo(0x655b59c3),T2 !=
855
sethi %hi(0x8f0ccc92),T2
857
or T2,%lo(0x8f0ccc92),T2
859
!pre-LOADed X(10),R10
868
sethi %hi(0xffeff47d),T2 !=
870
or T2,%lo(0xffeff47d),T2
881
sethi %hi(0x85845dd1),T2
883
or T2,%lo(0x85845dd1),T2
894
sethi %hi(0x6fa87e4f),T2
896
or T2,%lo(0x6fa87e4f),T2 !=
907
sethi %hi(0xfe2ce6e0),T2
909
or T2,%lo(0xfe2ce6e0),T2 !=
920
sethi %hi(0xa3014314),T2
922
or T2,%lo(0xa3014314),T2
924
!pre-LOADed X(13),R13
933
sethi %hi(0x4e0811a1),T2 !=
935
or T2,%lo(0x4e0811a1),T2
947
sethi %hi(0xf7537e82),T2 !=
949
or T2,%lo(0xf7537e82),T2
950
!pre-LOADed X(11),R11
961
sethi %hi(0xbd3af235),T2 !=
963
or T2,%lo(0xbd3af235),T2
975
sethi %hi(0x2ad7d2bb),T2 !=
977
or T2,%lo(0x2ad7d2bb),T2
993
sethi %hi(0xeb86d391),T2 !=
995
or T2,%lo(0xeb86d391),T2
1017
#ifdef OPENSSL_SYSNAME_ULTRASPARC
1018
bg,a,pt %icc,.Lmd5_block_loop
1020
bg,a .Lmd5_block_loop
1024
#ifdef ASI_PRIMARY_LITTLE
1030
.type md5_block,#function
1031
.size md5_block,(.-md5_block)