From 075e1c0b001c809e7bc86595b3d2447abac6e22c Mon Sep 17 00:00:00 2001
From: magnum <magnum>
Date: Tue, 29 Nov 2011 00:38:43 +0100
Subject: [PATCH 13/16] Bartavelle's mdfourmmx added

---
 src/Makefile  |   56 ++++----
 src/md4-mmx.S |  427 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/md4.h     |   10 ++
 src/md5-mmx.S |    4 +-
 4 files changed, 467 insertions(+), 30 deletions(-)
 create mode 100644 src/md4-mmx.S

diff --git a/src/Makefile b/src/Makefile
index 46c0186..77cc248 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -278,7 +278,7 @@ linux-x86-64-32-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -m32 -DHAVE_CRYPT -DHAVE_DL" \
 		ASFLAGS="$(ASFLAGS) -m32" \
 		LDFLAGS="$(LDFLAGS) -m32 -lcrypt -ldl"
@@ -287,7 +287,7 @@ linux-x86-64-32-sse2i:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		CFLAGS="$(CFLAGS) -m32 -msse2 -DHAVE_CRYPT -DHAVE_DL -DUSING_ICC_S_FILE" \
 		ASFLAGS="$(ASFLAGS) -m32 -msse2" \
 		LDFLAGS="$(LDFLAGS) -m32 -lcrypt -ldl"
@@ -296,7 +296,7 @@ linux-x86-64-32-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -m32 -DHAVE_CRYPT -DHAVE_DL" \
 		ASFLAGS="$(ASFLAGS) -m32" \
 		LDFLAGS="$(LDFLAGS) -m32 -lcrypt -ldl"
@@ -334,7 +334,7 @@ linux-x86-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -DHAVE_CRYPT -DHAVE_DL" \
 		LDFLAGS="$(LDFLAGS) -lcrypt -ldl"
 
@@ -342,7 +342,7 @@ linux-x86-sse2i:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		CFLAGS="$(CFLAGS) -msse2 -DHAVE_CRYPT -DHAVE_DL -DUSING_ICC_S_FILE" \
 		ASFLAGS="$(ASFLAGS) -msse2" \
 		LDFLAGS="$(LDFLAGS) -lcrypt -ldl"
@@ -351,7 +351,7 @@ linux-x86-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -DHAVE_CRYPT -DHAVE_DL" \
 		LDFLAGS="$(LDFLAGS) -lcrypt -ldl"
 
@@ -453,14 +453,14 @@ freebsd-x86-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -DBSD"
 
 freebsd-x86-sse2i:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		CFLAGS="$(CFLAGS) -msse2 -DUSING_ICC_S_FILE" \
 		ASFLAGS="$(ASFLAGS) -msse2 -DBSD" \
 
@@ -468,7 +468,7 @@ freebsd-x86-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -DBSD"
 
 freebsd-x86-any:
@@ -508,14 +508,14 @@ openbsd-x86-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -DBSD"
 
 openbsd-x86-sse2i:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		CFLAGS="$(CFLAGS) -msse2 -DUSING_ICC_S_FILE" \
 		ASFLAGS="$(ASFLAGS) -msse2 -DBSD"
 
@@ -523,7 +523,7 @@ openbsd-x86-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -DBSD"
 
 openbsd-x86-any:
@@ -686,7 +686,7 @@ solaris-x86-sse2-cc:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CC=cc \
 		CFLAGS="-c -fast -xarch=native -DHAVE_CRYPT $(OMPFLAGS)" \
 		ASFLAGS="-c -xarch=native $(OMPFLAGS)" \
@@ -699,7 +699,7 @@ solaris-x86-sse2-gcc:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -DHAVE_CRYPT" \
 		LDFLAGS="$(LDFLAGS) $(LDFLAGS_SOLARIS)"
 
@@ -708,7 +708,7 @@ solaris-x86-sse2i-gcc:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		CFLAGS="$(CFLAGS) -DHAVE_CRYPT -msse2 -DUSING_ICC_S_FILE" \
 		ASFLAGS="$(ASFLAGS) -msse2" \
 		LDFLAGS="$(LDFLAGS) $(LDFLAGS_SOLARIS)"
@@ -718,7 +718,7 @@ solaris-x86-mmx-cc:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CC=cc \
 		CFLAGS="-c -fast -xarch=native -DHAVE_CRYPT $(OMPFLAGS)" \
 		ASFLAGS="-c -xarch=native $(OMPFLAGS)" \
@@ -731,7 +731,7 @@ solaris-x86-mmx-gcc:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) c3_fmt.o solaris-x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -DHAVE_CRYPT" \
 		LDFLAGS="$(LDFLAGS) $(LDFLAGS_SOLARIS)"
 
@@ -843,7 +843,7 @@ macosx-x86-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -m32 -DUNDERSCORES -DBSD -DALIGN_LOG" \
 		CFLAGS="$(CFLAGS) -m32" \
 		LDFLAGS="$(LDFLAGS) -m32"
@@ -852,7 +852,7 @@ macosx-x86-sse2i:
 	$(LN) x86-ssei.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o sse-intrinsics-32.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o sse-intrinsics-32.o" \
 		ASFLAGS="$(ASFLAGS) -m32 -msse2 -DUNDERSCORES -DBSD -DALIGN_LOG" \
 		CFLAGS="$(CFLAGS) -m32 -msse2 -DUSING_ICC_S_FILE" \
 		LDFLAGS="$(LDFLAGS) -m32"
@@ -861,7 +861,7 @@ macosx-x86-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -m32 -DUNDERSCORES -DBSD -DALIGN_LOG" \
 		CFLAGS="$(CFLAGS) -m32" \
 		LDFLAGS="$(LDFLAGS) -m32"
@@ -962,7 +962,7 @@ john-macosx-x86:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		ASFLAGS="$(ASFLAGS) -arch i386 -m32 -DUNDERSCORES -DBSD -DALIGN_LOG" \
 		CFLAGS="$(CFLAGS) -arch i386 -m32" \
 		LDFLAGS="$(LDFLAGS) -arch i386 -m32"
@@ -1035,7 +1035,7 @@ irix-mips32:
 dos-djgpp-x86-mmx:
 	copy x86-mmx.h arch.h
 	$(MAKE) $(PROJ_DOS) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -DNO_JOHN_BLD -mpreferred-stack-boundary=2" \
 		ASFLAGS="$(ASFLAGS) -DUNDERSCORES -DALIGN_LOG"
 
@@ -1058,7 +1058,7 @@ win32-cygwin-x86-sse2:
 	$(CP) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ_WIN32) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -mpreferred-stack-boundary=4 -msse2 -m32" \
 		ASFLAGS="$(ASFLAGS) -DUNDERSCORES"
 
@@ -1066,7 +1066,7 @@ win32-cygwin-x86-mmx:
 	$(CP) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ_WIN32) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -mpreferred-stack-boundary=2" \
 		ASFLAGS="$(ASFLAGS) -DUNDERSCORES"
 
@@ -1091,7 +1091,7 @@ win32-mingw-x86-sse2:
 	$(CP) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ_WIN32_MINGW) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -Wall -mpreferred-stack-boundary=4 -msse2 -m32" \
 		ASFLAGS="$(ASFLAGS) -DUNDERSCORES"
 
@@ -1099,7 +1099,7 @@ win32-mingw-x86-mmx:
 	$(CP) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ_WIN32_MINGW) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o" \
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o" \
 		CFLAGS="$(CFLAGS) -mpreferred-stack-boundary=3 -mmmx -m32" \
 		ASFLAGS="$(ASFLAGS) -DUNDERSCORES"
 
@@ -1115,13 +1115,13 @@ beos-x86-sse2:
 	$(LN) x86-sse.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md5-mmx.o"
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-sse.o sha1-mmx.o md4-mmx.o md5-mmx.o"
 
 beos-x86-mmx:
 	$(LN) x86-mmx.h arch.h
 	@echo "#define JOHN_BLD" '"'$@'"' > john_build_rule.h
 	$(MAKE) $(PROJ) \
-		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md5-mmx.o"
+		JOHN_OBJS="$(JOHN_OBJS) x86.o x86-mmx.o sha1-mmx.o md4-mmx.o md5-mmx.o"
 
 beos-x86-any:
 	$(LN) x86-any.h arch.h
diff --git a/src/md4-mmx.S b/src/md4-mmx.S
new file mode 100644
index 0000000..768bc68
--- /dev/null
+++ b/src/md4-mmx.S
@@ -0,0 +1,427 @@
+#include "arch.h"
+
+// extern int mdfourmmx(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
+
+#if (MMX_COEF == 2)
+#ifdef UNDERSCORES
+#define mdfourmmx	_mdfourmmx
+#endif
+
+.globl mdfourmmx
+
+.data
+#if defined (MD4_SSE_PARA) && !defined (MMX_COEF)
+#define MMX_COEF 4
+#endif
+
+// align of 2*MMX_COEF was crashing on SSE2 builds (at least cross compiling from 64 bit linux)
+.align(4*MMX_COEF)
+
+const_init_a:
+.long 0x67452301
+.long 0x67452301
+const_init_b:
+.long 0xefcdab89
+.long 0xefcdab89
+const_init_c:
+.long 0x98badcfe
+.long 0x98badcfe
+const_init_d:
+.long 0x10325476
+.long 0x10325476
+
+const_stage2:
+.long 0x5a827999
+.long 0x5a827999
+const_stage3:
+.long 0x6ed9eba1
+.long 0x6ed9eba1
+
+.align(4*MMX_COEF)
+buffer:
+.zero(64*2)
+
+#define ctxa %mm0
+#define ctxb %mm1
+#define ctxc %mm2
+#define ctxd %mm3
+#define tmp1 %mm4
+#define tmp2 %mm5
+#define tmp3 %mm6
+#define tmp4 %mm7
+
+//#define F_MMX(x, y, z)			(z ^ (x & (y ^ z)))
+
+#define F(x,y,z) \
+	movq y, tmp1; \
+	pxor z, tmp1; \
+	pand x, tmp1; \
+	pxor z, tmp1
+
+//#define G_MMX(x, y, z)			((x & (y | z)) | (y & z))
+
+#define G(x,y,z) \
+	movq y, tmp1; \
+	movq y, tmp2; \
+	por z, tmp1; \
+	pand z, tmp2; \
+	pand x, tmp1; \
+	por tmp2, tmp1
+
+//#define H_MMX(x, y, z)			(x ^ y ^ z)
+#define H(x,y,z) \
+	movq x, tmp1; \
+	pxor y, tmp1; \
+	pxor z, tmp1
+
+//#define STEP_MMX(f, a, b, c, d, x, s) \
+//	(a) += f((b), (c), (d)) + (x); \
+//	(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
+
+#define STEP1(f, a, b, c, d, x, s) \
+	f(b, c, d); \
+	paddd (x*8)(%edx), tmp1; \
+	paddd tmp1, a; \
+	movq a, tmp3; \
+	pslld $s, a; \
+	psrld $(32-s), tmp3; \
+	por tmp3, a
+
+#define STEP2(f, a, b, c, d, x, s) \
+	f(b, c, d); \
+	paddd (x*8)(%edx), tmp1; \
+	paddd tmp4, tmp1; \
+	paddd tmp1, a; \
+	movq a, tmp3; \
+	pslld $s, a; \
+	psrld $(32-s), tmp3; \
+	por tmp3, a
+
+.text
+/*
+ * Try to do some asm md4 w/ mmx
+ * %eax ptr -> out
+ * %edx ptr -> in
+ * %ecx n
+ */
+
+mdfourmmx:
+	 //MD4 Init
+	pusha
+	
+	shl $3, %ecx
+	mov %ecx, %ebx
+	and $0xffff, %ecx
+	shrl $16,  %ebx
+	// %ecx contient la taille du premier mdp
+	// %edx celle du second
+	mov %ecx, (14*8)(%edx)
+	mov %ebx, (14*8+4)(%edx)
+
+	movq const_init_a, ctxa
+	movq const_init_b, ctxb
+	movq const_init_c, ctxc
+	movq const_init_d, ctxd
+
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 1, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 2, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 3, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 4, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 5, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 6, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 7, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 8, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 9, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 10, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 11, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 12, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 13, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 14, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 15, 19)
+
+	movq const_stage2, tmp4
+
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 4, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 8, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 12, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 1, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 5, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 9, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 13, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 2, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 6, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 10, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 14, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 3, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 7, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 11, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 15, 13)
+
+	movq const_stage3, tmp4
+
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 8, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 4, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 12, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 2, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 10, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 6, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 14, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 1, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 9, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 5, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 13, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 3, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 11, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 7, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 15, 15)
+
+	paddd const_init_a, ctxa
+	paddd const_init_b, ctxb
+	paddd const_init_c, ctxc
+	paddd const_init_d, ctxd
+
+	movq ctxa, 0(%eax)
+	movq ctxb, 8(%eax)
+	movq ctxc, 16(%eax)
+	movq ctxd, 24(%eax)
+
+	movd ctxa, %eax
+	emms
+
+	popa
+	
+	ret
+
+#elif (MMX_COEF == 4)
+
+// extern int mdfoursse2(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
+
+#ifdef UNDERSCORES
+#define mdfoursse2	_mdfoursse2
+#endif
+
+.globl mdfoursse2
+
+.data
+#if defined (MD4_SSE_PARA) && !defined (MMX_COEF)
+#define MMX_COEF 4
+#endif
+
+// align of 2*MMX_COEF was crashing on SSE2 builds (at least cross compiling from 64 bit linux)
+.align(4*MMX_COEF)
+
+const_init_a:
+.long 0x67452301
+.long 0x67452301
+.long 0x67452301
+.long 0x67452301
+const_init_b:
+.long 0xefcdab89
+.long 0xefcdab89
+.long 0xefcdab89
+.long 0xefcdab89
+const_init_c:
+.long 0x98badcfe
+.long 0x98badcfe
+.long 0x98badcfe
+.long 0x98badcfe
+const_init_d:
+.long 0x10325476
+.long 0x10325476
+.long 0x10325476
+.long 0x10325476
+
+const_stage2:
+.long 0x5a827999
+.long 0x5a827999
+.long 0x5a827999
+.long 0x5a827999
+const_stage3:
+.long 0x6ed9eba1
+.long 0x6ed9eba1
+.long 0x6ed9eba1
+.long 0x6ed9eba1
+
+.align(4*MMX_COEF)
+buffer:
+.zero(64*4)
+
+#define ctxa %xmm0
+#define ctxb %xmm1
+#define ctxc %xmm2
+#define ctxd %xmm3
+#define tmp1 %xmm4
+#define tmp2 %xmm5
+#define tmp3 %xmm6
+#define tmp4 %xmm7
+
+//#define F_MMX(x, y, z)			(z ^ (x & (y ^ z)))
+
+#define F(x,y,z) \
+	movapd y, tmp1; \
+	pxor z, tmp1; \
+	pand x, tmp1; \
+	pxor z, tmp1
+
+//#define G_MMX(x, y, z)			((x & (y | z)) | (y & z))
+
+#define G(x,y,z) \
+	movapd y, tmp1; \
+	movapd y, tmp2; \
+	por z, tmp1; \
+	pand z, tmp2; \
+	pand x, tmp1; \
+	por tmp2, tmp1
+
+//#define H_MMX(x, y, z)			(x ^ y ^ z)
+#define H(x,y,z) \
+	movapd x, tmp1; \
+	pxor y, tmp1; \
+	pxor z, tmp1
+
+//#define STEP_MMX(f, a, b, c, d, x, s) \
+//	(a) += f((b), (c), (d)) + (x); \
+//	(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
+
+#define STEP1(f, a, b, c, d, x, s) \
+	f(b, c, d); \
+	paddd (x*16)(%edx), tmp1; \
+	paddd tmp1, a; \
+	movapd a, tmp3; \
+	pslld $s, a; \
+	psrld $(32-s), tmp3; \
+	por tmp3, a
+
+#define STEP2(f, a, b, c, d, x, s) \
+	f(b, c, d); \
+	paddd (x*16)(%edx), tmp1; \
+	paddd tmp4, tmp1; \
+	paddd tmp1, a; \
+	movapd a, tmp3; \
+	pslld $s, a; \
+	psrld $(32-s), tmp3; \
+	por tmp3, a
+
+.text
+/*
+ * Try to do some asm md4 w/ sse2
+ * %eax ptr -> out
+ * %edx ptr -> in
+ * %ecx n
+ */
+
+mdfoursse2:
+	pusha
+	 //MD4 Init
+	
+	//mov %edx, %eax
+	//ret
+
+//	shl $3, %ecx
+	mov %ecx, %ebx
+	shr $8, %ecx
+	and $0xff, %ebx
+	shl $3, %ebx
+	mov %ebx, (14*16)(%edx)
+	
+	mov %ecx, %ebx
+	shr $8, %ecx
+	and $0xff, %ebx
+	shl $3, %ebx
+	mov %ebx, (14*16+4)(%edx)
+
+	mov %ecx, %ebx
+	shr $8, %ecx
+	and $0xff, %ebx
+	shl $3, %ebx
+	mov %ebx, (14*16+8)(%edx)
+
+	and $0xff, %ecx
+	shl $3, %ecx
+	mov %ecx, (14*16+12)(%edx)
+
+	movapd const_init_a, ctxa
+	movapd const_init_b, ctxb
+	movapd const_init_c, ctxc
+	movapd const_init_d, ctxd
+
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 1, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 2, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 3, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 4, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 5, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 6, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 7, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 8, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 9, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 10, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 11, 19)
+	STEP1(F, ctxa, ctxb, ctxc, ctxd, 12, 3)
+	STEP1(F, ctxd, ctxa, ctxb, ctxc, 13, 7)
+	STEP1(F, ctxc, ctxd, ctxa, ctxb, 14, 11)
+	STEP1(F, ctxb, ctxc, ctxd, ctxa, 15, 19)
+
+	movapd const_stage2, tmp4
+
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 4, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 8, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 12, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 1, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 5, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 9, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 13, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 2, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 6, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 10, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 14, 13)
+	STEP2(G, ctxa, ctxb, ctxc, ctxd, 3, 3)
+	STEP2(G, ctxd, ctxa, ctxb, ctxc, 7, 5)
+	STEP2(G, ctxc, ctxd, ctxa, ctxb, 11, 9)
+	STEP2(G, ctxb, ctxc, ctxd, ctxa, 15, 13)
+
+	movapd const_stage3, tmp4
+
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 0, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 8, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 4, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 12, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 2, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 10, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 6, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 14, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 1, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 9, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 5, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 13, 15)
+	STEP2(H, ctxa, ctxb, ctxc, ctxd, 3, 3)
+	STEP2(H, ctxd, ctxa, ctxb, ctxc, 11, 9)
+	STEP2(H, ctxc, ctxd, ctxa, ctxb, 7, 11)
+	STEP2(H, ctxb, ctxc, ctxd, ctxa, 15, 15)
+
+	paddd const_init_a, ctxa
+	paddd const_init_b, ctxb
+	paddd const_init_c, ctxc
+	paddd const_init_d, ctxd
+
+	movapd ctxa, 0(%eax)
+	movapd ctxb, 16(%eax)
+	movapd ctxc, 32(%eax)
+	movapd ctxd, 48(%eax)
+
+	movd ctxa, %eax
+	emms
+
+	popa
+	
+	ret
+
+#endif
+
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",@progbits
+#endif
diff --git a/src/md4.h b/src/md4.h
index ce4083c..9405d27 100644
--- a/src/md4.h
+++ b/src/md4.h
@@ -27,4 +27,14 @@ extern void MD4_Init(MD4_CTX *ctx);
 extern void MD4_Update(MD4_CTX *ctx, void *data, unsigned long size);
 extern void MD4_Final(unsigned char *result, MD4_CTX *ctx);
 
+/* Bartavelle's SSE/MMX asm functions */
+#if (MMX_COEF == 2)
+extern int mdfourmmx(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
+#endif
+
+#if (MMX_COEF == 4)
+#define mdfourmmx mdfoursse2
+extern int mdfoursse2(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
+#endif
+
 #endif
diff --git a/src/md5-mmx.S b/src/md5-mmx.S
index 54027d7..028306a 100644
--- a/src/md5-mmx.S
+++ b/src/md5-mmx.S
@@ -1,6 +1,6 @@
 #include "arch.h"
 
-// extern int mdfourmmx(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
+// extern int mdfivemmx(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
 
 #ifdef UNDERSCORES
 #define mdfivemmx	_mdfivemmx
@@ -151,7 +151,7 @@ stored: ; .long 0 ; .long 0 ; .long 0 ; .long 0
 
 .text
 /*
- * Try to do some asm md4 w/ mmx
+ * Try to do some asm md5 w/ mmx
  * %eax ptr -> out
  * %edx ptr -> in
  * %ecx n
-- 
1.7.5.4

