md5-sparcv9.S revision 7c478bd95313f5f23a4c958a745db2134aa03244
.ident "md5-sparcv9.S, Version 1.0"
.ident "SPARC V9 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
.file "md5-sparcv9.S"
/*
* ====================================================================
* Copyright (c) 1999 Andy Polyakov <appro@fy.chalmers.se>.
*
* Rights for redistribution and usage in source and binary forms are
* granted as long as above copyright notices are retained. Warranty
* of any kind is (of course:-) disclaimed.
* ====================================================================
*/
/*
* This is my modest contribution to OpenSSL project (see
* http://www.openssl.org/ for more information about it) and is an
* assembler implementation of MD5 block hash function. I've hand-coded
* this for the sole reason to reach UltraSPARC-specific "load in
* little-endian byte order" instruction. This gives up to 15%
* performance improvement for cases when input message is aligned at
* 32 bits boundary. The module was tested under both 32 *and* 64 bit
* kernels. For updates see http://fy.chalmers.se/~appro/hpe/.
*
*
* cc -xarch=v[9|8plus] -DOPENSSL_SYSNAME_ULTRASPARC -DMD5_BLOCK_DATA_ORDER \
* -c md5-sparcv9.S
*
* and with gcc:
*
* gcc -mcpu=ultrasparc -DOPENSSL_SYSNAME_ULTRASPARC -DMD5_BLOCK_DATA_ORDER \
* -c md5-sparcv9.S
*
* or if above fails (it does if you have gas):
*
* gcc -E -DOPENSSL_SYSNAMEULTRASPARC -DMD5_BLOCK_DATA_ORDER md5_block.sparc.S | \
*/
#define A %o0
#define B %o1
#define C %o2
#define D %o3
#if defined(MD5_BLOCK_DATA_ORDER)
# if defined(OPENSSL_SYSNAME_ULTRASPARC)
# define ASI_PRIMARY_LITTLE 0x88
# else
# error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!"
# endif
#else
# define X(i) [%i1+i*4]
# define md5_block md5_block_asm_host_order
#endif
#if defined(__SUNPRO_C) && defined(__sparcv9)
/* They've said -xarch=v9 at command line */
# define FRAME -192
/* They've said -m64 at command line */
# define FRAME -192
#else
# define FRAME -96
#endif
.align 32
#ifdef ASI_PRIMARY_LITTLE
#endif
!!!!!!!!Round 0
add A,B,A
add D,A,D
add C,D,C !=
add B,C,B
add A,B,A
add D,A,D
add C,D,C !=
add B,C,B
add A,B,A
add D,A,D
add C,D,C !=
add B,C,B
add A,B,A
add D,A,D
add C,D,C !=
add B,C,B
!!!!!!!!Round 1
add A,B,A
add D,A,D
add C,D,C
add B,C,B
add A,B,A
add D,A,D !=
add C,D,C !=
add B,C,B !=
add A,B,A
add D,A,D
add C,D,C
add B,C,B
add A,B,A
add D,A,D
add C,D,C
add B,C,B
!!!!!!!!Round 2
add A,B,A !=
add D,A,D
add C,D,C
add B,C,B
add A,B,A
add D,A,D !=
add C,D,C
add B,C,B
add A,B,A
add D,A,D !=
add C,D,C
add B,C,B
add A,B,A
add D,A,D
add C,D,C !=
add B,C,B
!!!!!!!!Round 3
add A,B,A
add D,A,D
add C,D,C
add B,C,B !=
add A,B,A
add D,A,D
add C,D,C
add B,C,B !=
add A,B,A !=
add D,A,D
add C,D,C
add B,C,B
add A,B,A
add D,A,D
add C,D,C
add B,C,B
nop !=
#ifdef OPENSSL_SYSNAME_ULTRASPARC
#else
#endif
#ifdef ASI_PRIMARY_LITTLE
#endif