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)