[FFmpeg-cvslog] md5: optimize second round by using 4-operation form of G()

Giorgio Vazzana git at videolan.org
Mon May 20 04:38:14 CEST 2013


ffmpeg | branch: master | Giorgio Vazzana <mywing81 at gmail.com> | Sat May 18 13:53:52 2013 +0200| [d0a34aeedff187873e1b42e0902d9dfbba08a1f4] | committer: Michael Niedermayer

md5: optimize second round by using 4-operation form of G()

4-operation form is preferred over 3-operation because it breaks a long
dependency chain, thus allowing a superscalar processor to execute more
operations in parallel.
The idea was taken from: http://www.zorinaq.com/papers/md5-amd64.html

AMD Athlon(tm) II X3 450 Processor, x86_64

$ for i in $(seq 1 4); do ./avutil_md5_test2; done
size: 1048576  runs: 1024  time:    5.821 +- 0.019
size: 1048576  runs: 1024  time:    5.822 +- 0.019
size: 1048576  runs: 1024  time:    5.841 +- 0.018
size: 1048576  runs: 1024  time:    5.821 +- 0.018

$ for i in $(seq 1 4); do ./avutil_md5_test2; done
size: 1048576  runs: 1024  time:    5.646 +- 0.019
size: 1048576  runs: 1024  time:    5.646 +- 0.018
size: 1048576  runs: 1024  time:    5.642 +- 0.019
size: 1048576  runs: 1024  time:    5.641 +- 0.019

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d0a34aeedff187873e1b42e0902d9dfbba08a1f4
---

 libavutil/md5.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavutil/md5.c b/libavutil/md5.c
index 7375ce5..e3c4981 100644
--- a/libavutil/md5.c
+++ b/libavutil/md5.c
@@ -84,7 +84,7 @@ static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32)
                                                                         \
         if (i < 32) {                                                   \
             if (i < 16) a += (d ^ (b & (c ^ d))) + X[       i  & 15];   \
-            else        a += (c ^ (d & (c ^ b))) + X[(1 + 5*i) & 15];   \
+            else        a += ((d & b) | (~d & c))+ X[(1 + 5*i) & 15];   \
         } else {                                                        \
             if (i < 48) a += (b ^ c ^ d)         + X[(5 + 3*i) & 15];   \
             else        a += (c ^ (b | ~d))      + X[(    7*i) & 15];   \



More information about the ffmpeg-cvslog mailing list