/*
 *  rfc1321 requires that I include this.  The code is new.  The constants
 *  all come from the rfc (hence the copyright).  We trade a table for the
 *  macros in rfc.  The total size is a lot less. -- presotto
 *
 *	Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
 *	rights reserved.
 *
 *	License to copy and use this software is granted provided that it
 *	is identified as the "RSA Data Security, Inc. MD5 Message-Digest
 *	Algorithm" in all material mentioning or referencing this software
 *	or this function.
 *
 *	License is also granted to make and use derivative works provided
 *	that such works are identified as "derived from the RSA Data
 *	Security, Inc. MD5 Message-Digest Algorithm" in all material
 *	mentioning or referencing the derived work.
 *
 *	RSA Data Security, Inc. makes no representations concerning either
 *	the merchantability of this software or the suitability of this
 *	software forany particular purpose. It is provided "as is"
 *	without express or implied warranty of any kind.
 *	These notices must be retained in any copies of any part of this
 *	documentation and/or software.
 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22

#define S21 5
#define S22 9
#define S23 14
#define S24 20

#define S31 4
#define S32 11
#define S33 16
#define S34 23

#define S41 6
#define S42 10
#define S43 15
#define S44 21

#define PAYME(x) $ ## x

/*
 * SI is data
 *	a += FN(B,C,D);
 *	a += x[sh] + t[sh];
 *	a = (a << S11) | (a >> (32 - S11));
 *	a += b;
 */

#define BODY1(off,V,FN,SH,A,B,C,D)\
	FN(B,C,D)\
	leal V(A, %edi, 1), A;\
	addl off(%ebp), A;\
	roll PAYME(SH), A;\
	addl B, A;\

#define BODY(off,V,FN,SH,A,B,C,D)\
	FN(B,C,D)\
	leal V(A, %edi, 1), A;\
	addl (off)(%ebp), A;\
	roll PAYME(SH), A;\
	addl B,A;\

/*
 * fn1 = ((c ^ d) & b) ^ d
 */
#define FN1(B,C,D)\
	movl C, %edi;\
	xorl D, %edi;\
	andl B, %edi;\
	xorl D, %edi;\

/*
 * fn2 = ((b ^ c) & d) ^ c;
 */
#define FN2(B,C,D)\
	movl B, %edi;\
	xorl C, %edi;\
	andl D, %edi;\
	xorl C, %edi;\

/*
 * fn3 = b ^ c ^ d;
 */
#define FN3(B,C,D)\
	movl B, %edi;\
	xorl C, %edi;\
	xorl D, %edi;\

/*
 * fn4 = c ^ (b | ~d);
 */
#define FN4(B,C,D)\
	movl D, %edi;\
	xorl $-1, %edi;\
	orl B, %edi;\
	xorl C, %edi;\

#define	STACKSIZE	20

#define	DATA	(STACKSIZE+8)
#define	LEN	(STACKSIZE+12)
#define	STATE	(STACKSIZE+16)

#define EDATA	(STACKSIZE-4)
#define OLDEBX	(STACKSIZE-8)
#define OLDESI	(STACKSIZE-12)
#define OLDEDI	(STACKSIZE-16)

	.text

	.p2align 2,0x90
	.globl _md5block
		.type _md5block, @function
	_md5block:

	/* Prelude */
	pushl %ebp
	subl $(STACKSIZE), %esp
	movl %ebx, OLDEBX(%esp)
	movl %esi, OLDESI(%esp)
	movl %edi, OLDEDI(%esp)

	movl	DATA(%esp), %eax
	addl	LEN(%esp), %eax
	movl	%eax, EDATA(%esp)

	movl DATA(%esp), %ebp

0:
	movl STATE(%esp), %esi
	movl (%esi), %eax
	movl 4(%esi), %ebx
	movl 8(%esi), %ecx
	movl 12(%esi), %edx

	BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax)

	BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx)
	BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx)
	BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx)
	BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax)


	BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax)

	BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx)
	BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx)
	BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx)
	BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax)


	BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax)

	BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx)
	BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx)
	BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx)
	BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax)


	BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax)

	BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx)
	BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx)
	BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx)
	BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax)

	addl $(16*4), %ebp
	movl STATE(%esp), %edi
	addl %eax,0(%edi)
	addl %ebx,4(%edi)
	addl %ecx,8(%edi)
	addl %edx,12(%edi)

	movl EDATA(%esp), %edi
	cmpl %edi, %ebp
	jb 0b

	/* Postlude */
	movl OLDEBX(%esp), %ebx
	movl OLDESI(%esp), %esi
	movl OLDEDI(%esp), %edi
	addl $(STACKSIZE), %esp
	popl %ebp
	ret

