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] -DULTRASPARC -DMD5_BLOCK_DATA_ORDER \
32 * gcc -mcpu=ultrasparc -DULTRASPARC -DMD5_BLOCK_DATA_ORDER \
35 * or if above fails (it does if you have gas):
37 * gcc -E -DULTRASPARC -DMD5_BLOCK_DATA_ORDER md5_block.sparc.S | \
38 * as -xarch=v8plus /dev/fd/0 -o md5-sparcv9.o
69 #define Aval R5 /* those not used at the end of the last round */
74 #if defined(MD5_BLOCK_DATA_ORDER)
75 # if defined(ULTRASPARC)
77 # define X(i) [%i1+i*4]%asi
78 # define md5_block md5_block_asm_data_order_aligned
79 # define ASI_PRIMARY_LITTLE 0x88
81 # error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!"
85 # define X(i) [%i1+i*4]
86 # define md5_block md5_block_asm_host_order
89 .section ".text",#alloc,#execinstr
91 #if defined(__SUNPRO_C) && defined(__sparcv9)
92 /* They've said -xarch=v9 at command line */
93 .register %g2,#scratch
94 .register %g3,#scratch
96 #elif defined(__GNUC__) && defined(__arch64__)
97 /* They've said -m64 at command line */
98 .register %g2,#scratch
99 .register %g3,#scratch
115 #ifdef ASI_PRIMARY_LITTLE
116 rd %asi,%o7 ! How dare I? Well, I just do:-)
117 wr %g0,ASI_PRIMARY_LITTLE,%asi
126 sethi %hi(0xd76aa478),T2
128 or T2,%lo(0xd76aa478),T2 !=
140 sethi %hi(0xe8c7b756),T2
142 or T2,%lo(0xe8c7b756),T2
154 sethi %hi(0x242070db),T2 !=
156 or T2,%lo(0x242070db),T2
168 sethi %hi(0xc1bdceee),T2
170 or T2,%lo(0xc1bdceee),T2
182 sethi %hi(0xf57c0faf),T2
184 or T2,%lo(0xf57c0faf),T2 !=
196 sethi %hi(0x4787c62a),T2
198 or T2,%lo(0x4787c62a),T2
210 sethi %hi(0xa8304613),T2 !=
212 or T2,%lo(0xa8304613),T2
224 sethi %hi(0xfd469501),T2
226 or T2,%lo(0xfd469501),T2
238 sethi %hi(0x698098d8),T2
240 or T2,%lo(0x698098d8),T2 !=
252 sethi %hi(0x8b44f7af),T2
254 or T2,%lo(0x8b44f7af),T2
266 sethi %hi(0xffff5bb1),T2 !=
268 or T2,%lo(0xffff5bb1),T2
280 sethi %hi(0x895cd7be),T2
282 or T2,%lo(0x895cd7be),T2
294 sethi %hi(0x6b901122),T2
296 or T2,%lo(0x6b901122),T2 !=
308 sethi %hi(0xfd987193),T2
310 or T2,%lo(0xfd987193),T2
322 sethi %hi(0xa679438e),T2 !=
324 or T2,%lo(0xa679438e),T2
336 sethi %hi(0x49b40821),T2
338 or T2,%lo(0x49b40821),T2
352 sethi %hi(0xf61e2562),T2
354 or T2,%lo(0xf61e2562),T2
366 sethi %hi(0xc040b340),T2
368 or T2,%lo(0xc040b340),T2
371 !pre-LOADed X(11),R11
380 sethi %hi(0x265e5a51),T2
382 or T2,%lo(0x265e5a51),T2
394 sethi %hi(0xe9b6c7aa),T2
396 or T2,%lo(0xe9b6c7aa),T2
408 sethi %hi(0xd62f105d),T2
410 or T2,%lo(0xd62f105d),T2
413 !pre-LOADed X(10),R10
422 sethi %hi(0x02441453),T2
424 or T2,%lo(0x02441453),T2
436 sethi %hi(0xd8a1e681),T2
438 or T2,%lo(0xd8a1e681),T2 !=
450 sethi %hi(0xe7d3fbc8),T2
452 or T2,%lo(0xe7d3fbc8),T2 !=
464 sethi %hi(0x21e1cde6),T2
466 or T2,%lo(0x21e1cde6),T2 !=
478 sethi %hi(0xc33707d6),T2
480 or T2,%lo(0xc33707d6),T2
492 sethi %hi(0xf4d50d87),T2
494 or T2,%lo(0xf4d50d87),T2
506 sethi %hi(0x455a14ed),T2
508 or T2,%lo(0x455a14ed),T2
511 !pre-LOADed X(13),R13
520 sethi %hi(0xa9e3e905),T2
522 or T2,%lo(0xa9e3e905),T2
534 sethi %hi(0xfcefa3f8),T2
536 or T2,%lo(0xfcefa3f8),T2
548 sethi %hi(0x676f02d9),T2
550 or T2,%lo(0x676f02d9),T2
553 !pre-LOADed X(12),R12
562 sethi %hi(0x8d2a4c8a),T2
564 or T2,%lo(0x8d2a4c8a),T2
578 sethi %hi(0xfffa3942),T2
580 or T2,%lo(0xfffa3942),T2
591 sethi %hi(0x8771f681),T2
593 or T2,%lo(0x8771f681),T2 !=
595 !pre-LOADed X(11),R11
604 sethi %hi(0x6d9d6122),T2
606 or T2,%lo(0x6d9d6122),T2
617 sethi %hi(0xfde5380c),T2
619 or T2,%lo(0xfde5380c),T2
630 sethi %hi(0xa4beea44),T2 !=
632 or T2,%lo(0xa4beea44),T2
643 sethi %hi(0x4bdecfa9),T2
645 or T2,%lo(0x4bdecfa9),T2
656 sethi %hi(0xf6bb4b60),T2
658 or T2,%lo(0xf6bb4b60),T2 !=
660 !pre-LOADed X(10),R10
669 sethi %hi(0xbebfbc70),T2
671 or T2,%lo(0xbebfbc70),T2
673 !pre-LOADed X(13),R13
682 sethi %hi(0x289b7ec6),T2 !=
684 or T2,%lo(0x289b7ec6),T2
695 sethi %hi(0xeaa127fa),T2
697 or T2,%lo(0xeaa127fa),T2
708 sethi %hi(0xd4ef3085),T2
710 or T2,%lo(0xd4ef3085),T2 !=
721 sethi %hi(0x04881d05),T2
723 or T2,%lo(0x04881d05),T2
734 sethi %hi(0xd9d4d039),T2 !=
736 or T2,%lo(0xd9d4d039),T2
738 !pre-LOADed X(12),R12
747 sethi %hi(0xe6db99e5),T2
749 or T2,%lo(0xe6db99e5),T2
760 sethi %hi(0x1fa27cf8),T2
762 or T2,%lo(0x1fa27cf8),T2
773 sethi %hi(0xc4ac5665),T2
775 or T2,%lo(0xc4ac5665),T2 !=
788 sethi %hi(0xf4292244),T2
790 or T2,%lo(0xf4292244),T2
801 sethi %hi(0x432aff97),T2 !=
803 or T2,%lo(0x432aff97),T2
814 sethi %hi(0xab9423a7),T2 !=
816 or T2,%lo(0xab9423a7),T2
827 sethi %hi(0xfc93a039),T2
829 or T2,%lo(0xfc93a039),T2
831 !pre-LOADed X(12),R12
840 sethi %hi(0x655b59c3),T2
842 or T2,%lo(0x655b59c3),T2 !=
853 sethi %hi(0x8f0ccc92),T2
855 or T2,%lo(0x8f0ccc92),T2
857 !pre-LOADed X(10),R10
866 sethi %hi(0xffeff47d),T2 !=
868 or T2,%lo(0xffeff47d),T2
879 sethi %hi(0x85845dd1),T2
881 or T2,%lo(0x85845dd1),T2
892 sethi %hi(0x6fa87e4f),T2
894 or T2,%lo(0x6fa87e4f),T2 !=
905 sethi %hi(0xfe2ce6e0),T2
907 or T2,%lo(0xfe2ce6e0),T2 !=
918 sethi %hi(0xa3014314),T2
920 or T2,%lo(0xa3014314),T2
922 !pre-LOADed X(13),R13
931 sethi %hi(0x4e0811a1),T2 !=
933 or T2,%lo(0x4e0811a1),T2
945 sethi %hi(0xf7537e82),T2 !=
947 or T2,%lo(0xf7537e82),T2
948 !pre-LOADed X(11),R11
959 sethi %hi(0xbd3af235),T2 !=
961 or T2,%lo(0xbd3af235),T2
973 sethi %hi(0x2ad7d2bb),T2 !=
975 or T2,%lo(0x2ad7d2bb),T2
991 sethi %hi(0xeb86d391),T2 !=
993 or T2,%lo(0xeb86d391),T2
1016 bg,a,pt %icc,.Lmd5_block_loop
1018 bg,a .Lmd5_block_loop
1022 #ifdef ASI_PRIMARY_LITTLE
1028 .type md5_block,#function
1029 .size md5_block,(.-md5_block)