os/ossrv/genericopenlibs/liboil/src/i386/md5_i386.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /*
     2  * LIBOIL - Library of Optimized Inner Loops
     3  * Copyright (c) 2004 David A. Schleef <ds@schleef.org>
     4  * All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions
     8  * are met:
     9  * 1. Redistributions of source code must retain the above copyright
    10  *    notice, this list of conditions and the following disclaimer.
    11  * 2. Redistributions in binary form must reproduce the above copyright
    12  *    notice, this list of conditions and the following disclaimer in the
    13  *    documentation and/or other materials provided with the distribution.
    14  * 
    15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
    19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
    24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    25  * POSSIBILITY OF SUCH DAMAGE.
    26  */
    27 //Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
    28 
    29 #ifdef HAVE_CONFIG_H
    30 #include "config.h"
    31 #endif
    32 
    33 #include <liboil/liboilfunction.h>
    34 #include <liboil/liboilclasses.h>
    35 
    36 
    37 #define F1(x, y, z) (z ^ (x & (y ^ z)))
    38 #define F2(x, y, z) F1(z, x, y)
    39 #define F3(x, y, z) (x ^ y ^ z)
    40 #define F4(x, y, z) (y ^ (x | ~z))
    41 
    42 #define MD5STEP(f,w,x,y,z,in,s) \
    43   (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
    44 
    45 
    46 static void
    47 md5_asm1(uint32_t *state, uint32_t *src)
    48 {
    49 #if !defined(__WINSCW__) && !defined(__WINS__)      
    50   struct {
    51     void *state;
    52     void *src;
    53     void *ebp;
    54     void *ebx;
    55   }tmp;
    56 
    57   tmp.state = state;
    58   tmp.src = src;
    59 
    60   __asm__ __volatile__ (
    61       "  mov %%ebp, 0x8(%%eax)\n"
    62       "  mov %%ebx, 0xc(%%eax)\n"
    63       "  mov %%eax, %%ebp\n"
    64       "  mov (%%ebp), %%esi\n"
    65       "  mov (%%esi), %%eax\n"
    66       "  mov 0x4(%%esi), %%ebx\n"
    67       "  mov 0x8(%%esi), %%ecx\n"
    68       "  mov 0xc(%%esi), %%edx\n"
    69       "  mov 0x4(%%ebp), %%esi\n"
    70 
    71 #define STEP1(r1,r2,r3,r4,offset,constant,rotate) \
    72       "  mov %%e" #r4 "x, %%edi\n" \
    73       "  xor %%e" #r3 "x, %%edi\n" \
    74       "  and %%e" #r2 "x, %%edi\n" \
    75       "  xor %%e" #r4 "x, %%edi\n" \
    76       "  add %%edi, %%e" #r1 "x\n" \
    77       "  add (" #offset "* 4)(%%esi), %%e" #r1 "x\n" \
    78       "  add $" #constant ", %%e" #r1 "x\n" \
    79       "  rol $" #rotate ", %%e" #r1 "x\n" \
    80       "  add %%e" #r2 "x, %%e" #r1 "x\n"
    81 
    82       STEP1 (a, b, c, d, 0, 0xd76aa478, 7)
    83       STEP1 (d, a, b, c, 1, 0xe8c7b756, 12)
    84       STEP1 (c, d, a, b, 2, 0x242070db, 17)
    85       STEP1 (b, c, d, a, 3, 0xc1bdceee, 22)
    86       STEP1 (a, b, c, d, 4, 0xf57c0faf, 7)
    87       STEP1 (d, a, b, c, 5, 0x4787c62a, 12)
    88       STEP1 (c, d, a, b, 6, 0xa8304613, 17)
    89       STEP1 (b, c, d, a, 7, 0xfd469501, 22)
    90       STEP1 (a, b, c, d, 8, 0x698098d8, 7)
    91       STEP1 (d, a, b, c, 9, 0x8b44f7af, 12)
    92       STEP1 (c, d, a, b, 10, 0xffff5bb1, 17)
    93       STEP1 (b, c, d, a, 11, 0x895cd7be, 22)
    94       STEP1 (a, b, c, d, 12, 0x6b901122, 7)
    95       STEP1 (d, a, b, c, 13, 0xfd987193, 12)
    96       STEP1 (c, d, a, b, 14, 0xa679438e, 17)
    97       STEP1 (b, c, d, a, 15, 0x49b40821, 22)
    98       
    99 #define STEP2(r1,r2,r3,r4,offset,constant,rotate) \
   100       "  mov %%e" #r3 "x, %%edi\n" \
   101       "  xor %%e" #r2 "x, %%edi\n" \
   102       "  and %%e" #r4 "x, %%edi\n" \
   103       "  xor %%e" #r3 "x, %%edi\n" \
   104       "  add %%edi, %%e" #r1 "x\n" \
   105       "  add (" #offset "*4)(%%esi), %%e" #r1 "x\n" \
   106       "  add $" #constant ", %%e" #r1 "x\n" \
   107       "  rol $" #rotate ", %%e" #r1 "x\n" \
   108       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   109 
   110       STEP2(a, b, c, d, 1, 0xf61e2562, 5)
   111       STEP2(d, a, b, c, 6, 0xc040b340, 9)
   112       STEP2(c, d, a, b, 11, 0x265e5a51, 14)
   113       STEP2(b, c, d, a, 0, 0xe9b6c7aa, 20)
   114       STEP2(a, b, c, d, 5, 0xd62f105d, 5)
   115       STEP2(d, a, b, c, 10, 0x02441453, 9)
   116       STEP2(c, d, a, b, 15, 0xd8a1e681, 14)
   117       STEP2(b, c, d, a, 4, 0xe7d3fbc8, 20)
   118       STEP2(a, b, c, d, 9, 0x21e1cde6, 5)
   119       STEP2(d, a, b, c, 14, 0xc33707d6, 9)
   120       STEP2(c, d, a, b, 3, 0xf4d50d87, 14)
   121       STEP2(b, c, d, a, 8, 0x455a14ed, 20)
   122       STEP2(a, b, c, d, 13, 0xa9e3e905, 5)
   123       STEP2(d, a, b, c, 2, 0xfcefa3f8, 9)
   124       STEP2(c, d, a, b, 7, 0x676f02d9, 14)
   125       STEP2(b, c, d, a, 12, 0x8d2a4c8a, 20)
   126 
   127 #define STEP3(r1,r2,r3,r4,offset,constant,rotate) \
   128       "  mov %%e" #r4 "x, %%edi\n" \
   129       "  xor %%e" #r3 "x, %%edi\n" \
   130       "  xor %%e" #r2 "x, %%edi\n" \
   131       "  add %%edi, %%e" #r1 "x\n" \
   132       "  add (" #offset "*4)(%%esi), %%e" #r1 "x\n" \
   133       "  add $" #constant ", %%e" #r1 "x\n" \
   134       "  rol $" #rotate ", %%e" #r1 "x\n" \
   135       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   136 
   137       STEP3 (a, b, c, d, 5, 0xfffa3942, 4)
   138       STEP3 (d, a, b, c, 8, 0x8771f681, 11)
   139       STEP3 (c, d, a, b, 11, 0x6d9d6122, 16)
   140       STEP3 (b, c, d, a, 14, 0xfde5380c, 23)
   141       STEP3 (a, b, c, d, 1, 0xa4beea44, 4)
   142       STEP3 (d, a, b, c, 4, 0x4bdecfa9, 11)
   143       STEP3 (c, d, a, b, 7, 0xf6bb4b60, 16)
   144       STEP3 (b, c, d, a, 10, 0xbebfbc70, 23)
   145       STEP3 (a, b, c, d, 13, 0x289b7ec6, 4)
   146       STEP3 (d, a, b, c, 0, 0xeaa127fa, 11)
   147       STEP3 (c, d, a, b, 3, 0xd4ef3085, 16)
   148       STEP3 (b, c, d, a, 6, 0x04881d05, 23)
   149       STEP3 (a, b, c, d, 9, 0xd9d4d039, 4)
   150       STEP3 (d, a, b, c, 12, 0xe6db99e5, 11)
   151       STEP3 (c, d, a, b, 15, 0x1fa27cf8, 16)
   152       STEP3 (b, c, d, a, 2, 0xc4ac5665, 23)
   153 
   154 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
   155       "  mov %%e" #r4 "x, %%edi\n" \
   156       "  not %%edi\n" \
   157       "  or %%e" #r2 "x, %%edi\n" \
   158       "  xor %%e" #r3 "x, %%edi\n" \
   159       "  add %%edi, %%e" #r1 "x\n" \
   160       "  add (" #offset "*4)(%%esi), %%e" #r1 "x\n" \
   161       "  add $" #constant ", %%e" #r1 "x\n" \
   162       "  rol $" #rotate ", %%e" #r1 "x\n" \
   163       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   164 
   165       STEP4 (a, b, c, d, 0, 0xf4292244, 6)
   166       STEP4 (d, a, b, c, 7, 0x432aff97, 10)
   167       STEP4 (c, d, a, b, 14, 0xab9423a7, 15)
   168       STEP4 (b, c, d, a, 5, 0xfc93a039, 21)
   169       STEP4 (a, b, c, d, 12, 0x655b59c3, 6)
   170       STEP4 (d, a, b, c, 3, 0x8f0ccc92, 10)
   171       STEP4 (c, d, a, b, 10, 0xffeff47d, 15)
   172       STEP4 (b, c, d, a, 1, 0x85845dd1, 21)
   173       STEP4 (a, b, c, d, 8, 0x6fa87e4f, 6)
   174       STEP4 (d, a, b, c, 15, 0xfe2ce6e0, 10)
   175       STEP4 (c, d, a, b, 6, 0xa3014314, 15)
   176       STEP4 (b, c, d, a, 13, 0x4e0811a1, 21)
   177       STEP4 (a, b, c, d, 4, 0xf7537e82, 6)
   178       STEP4 (d, a, b, c, 11, 0xbd3af235, 10)
   179       STEP4 (c, d, a, b, 2, 0x2ad7d2bb, 15)
   180       STEP4 (b, c, d, a, 9, 0xeb86d391, 21)
   181 
   182       "  mov (%%ebp), %%edi\n"
   183       "  add %%eax, 0x0(%%edi)\n"
   184       "  add %%ebx, 0x4(%%edi)\n"
   185       "  add %%ecx, 0x8(%%edi)\n"
   186       "  add %%edx, 0xc(%%edi)\n"
   187       "  mov 0xc(%%ebp), %%ebx\n"
   188       "  mov 0x8(%%ebp), %%ebp\n"
   189       :
   190       : "a" (&tmp)
   191       : "esi", "ecx", "edx", "edi", "memory");
   192 #endif
   193 }
   194 #undef STEP1
   195 #undef STEP2
   196 #undef STEP3
   197 #undef STEP4
   198 OIL_DEFINE_IMPL (md5_asm1, md5);
   199 
   200 static void
   201 md5_asm2(uint32_t *state, uint32_t *src)
   202 {
   203 #if !defined(__WINSCW__) && !defined(__WINS__)      
   204   struct {
   205     void *state;
   206     void *src;
   207     void *ebp;
   208     void *ebx;
   209   }tmp;
   210 
   211   tmp.state = state;
   212   tmp.src = src;
   213 
   214   asm (
   215       "  mov %%ebp, 0x8(%%eax)\n"
   216       "  mov %%ebx, 0xc(%%eax)\n"
   217       "  mov %%eax, %%ebp\n"
   218       "  mov (%%ebp), %%esi\n"
   219       "  mov (%%esi), %%eax\n"
   220       "  mov 0x4(%%esi), %%ebx\n"
   221       "  mov 0x8(%%esi), %%ecx\n"
   222       "  mov 0xc(%%esi), %%edx\n"
   223       "  mov 0x4(%%ebp), %%esi\n"
   224 
   225 #define STEP1(r1,r2,r3,r4,offset,constant,rotate) \
   226       "  mov %%e" #r4 "x, %%edi\n" \
   227       "  xor %%e" #r3 "x, %%edi\n" \
   228       "  and %%e" #r2 "x, %%edi\n" \
   229       "  xor %%e" #r4 "x, %%edi\n" \
   230       "  add %%edi, %%e" #r1 "x\n" \
   231       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   232       "  add $" #constant ", %%edi\n" \
   233       "  add %%edi, %%e" #r1 "x\n" \
   234       "  rol $" #rotate ", %%e" #r1 "x\n" \
   235       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   236 
   237       STEP1 (a, b, c, d, 0, 0xd76aa478, 7)
   238       STEP1 (d, a, b, c, 1, 0xe8c7b756, 12)
   239       STEP1 (c, d, a, b, 2, 0x242070db, 17)
   240       STEP1 (b, c, d, a, 3, 0xc1bdceee, 22)
   241       STEP1 (a, b, c, d, 4, 0xf57c0faf, 7)
   242       STEP1 (d, a, b, c, 5, 0x4787c62a, 12)
   243       STEP1 (c, d, a, b, 6, 0xa8304613, 17)
   244       STEP1 (b, c, d, a, 7, 0xfd469501, 22)
   245       STEP1 (a, b, c, d, 8, 0x698098d8, 7)
   246       STEP1 (d, a, b, c, 9, 0x8b44f7af, 12)
   247       STEP1 (c, d, a, b, 10, 0xffff5bb1, 17)
   248       STEP1 (b, c, d, a, 11, 0x895cd7be, 22)
   249       STEP1 (a, b, c, d, 12, 0x6b901122, 7)
   250       STEP1 (d, a, b, c, 13, 0xfd987193, 12)
   251       STEP1 (c, d, a, b, 14, 0xa679438e, 17)
   252       STEP1 (b, c, d, a, 15, 0x49b40821, 22)
   253       
   254 #define STEP2(r1,r2,r3,r4,offset,constant,rotate) \
   255       "  mov %%e" #r3 "x, %%edi\n" \
   256       "  xor %%e" #r2 "x, %%edi\n" \
   257       "  and %%e" #r4 "x, %%edi\n" \
   258       "  xor %%e" #r3 "x, %%edi\n" \
   259       "  add %%edi, %%e" #r1 "x\n" \
   260       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   261       "  add $" #constant ", %%edi\n" \
   262       "  add %%edi, %%e" #r1 "x\n" \
   263       "  rol $" #rotate ", %%e" #r1 "x\n" \
   264       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   265 
   266       STEP2(a, b, c, d, 1, 0xf61e2562, 5)
   267       STEP2(d, a, b, c, 6, 0xc040b340, 9)
   268       STEP2(c, d, a, b, 11, 0x265e5a51, 14)
   269       STEP2(b, c, d, a, 0, 0xe9b6c7aa, 20)
   270       STEP2(a, b, c, d, 5, 0xd62f105d, 5)
   271       STEP2(d, a, b, c, 10, 0x02441453, 9)
   272       STEP2(c, d, a, b, 15, 0xd8a1e681, 14)
   273       STEP2(b, c, d, a, 4, 0xe7d3fbc8, 20)
   274       STEP2(a, b, c, d, 9, 0x21e1cde6, 5)
   275       STEP2(d, a, b, c, 14, 0xc33707d6, 9)
   276       STEP2(c, d, a, b, 3, 0xf4d50d87, 14)
   277       STEP2(b, c, d, a, 8, 0x455a14ed, 20)
   278       STEP2(a, b, c, d, 13, 0xa9e3e905, 5)
   279       STEP2(d, a, b, c, 2, 0xfcefa3f8, 9)
   280       STEP2(c, d, a, b, 7, 0x676f02d9, 14)
   281       STEP2(b, c, d, a, 12, 0x8d2a4c8a, 20)
   282 
   283 #define STEP3(r1,r2,r3,r4,offset,constant,rotate) \
   284       "  mov %%e" #r4 "x, %%edi\n" \
   285       "  xor %%e" #r3 "x, %%edi\n" \
   286       "  xor %%e" #r2 "x, %%edi\n" \
   287       "  add %%edi, %%e" #r1 "x\n" \
   288       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   289       "  add $" #constant ", %%edi\n" \
   290       "  add %%edi, %%e" #r1 "x\n" \
   291       "  rol $" #rotate ", %%e" #r1 "x\n" \
   292       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   293 
   294       STEP3 (a, b, c, d, 5, 0xfffa3942, 4)
   295       STEP3 (d, a, b, c, 8, 0x8771f681, 11)
   296       STEP3 (c, d, a, b, 11, 0x6d9d6122, 16)
   297       STEP3 (b, c, d, a, 14, 0xfde5380c, 23)
   298       STEP3 (a, b, c, d, 1, 0xa4beea44, 4)
   299       STEP3 (d, a, b, c, 4, 0x4bdecfa9, 11)
   300       STEP3 (c, d, a, b, 7, 0xf6bb4b60, 16)
   301       STEP3 (b, c, d, a, 10, 0xbebfbc70, 23)
   302       STEP3 (a, b, c, d, 13, 0x289b7ec6, 4)
   303       STEP3 (d, a, b, c, 0, 0xeaa127fa, 11)
   304       STEP3 (c, d, a, b, 3, 0xd4ef3085, 16)
   305       STEP3 (b, c, d, a, 6, 0x04881d05, 23)
   306       STEP3 (a, b, c, d, 9, 0xd9d4d039, 4)
   307       STEP3 (d, a, b, c, 12, 0xe6db99e5, 11)
   308       STEP3 (c, d, a, b, 15, 0x1fa27cf8, 16)
   309       STEP3 (b, c, d, a, 2, 0xc4ac5665, 23)
   310 
   311 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
   312       "  mov %%e" #r4 "x, %%edi\n" \
   313       "  not %%edi\n" \
   314       "  or %%e" #r2 "x, %%edi\n" \
   315       "  xor %%e" #r3 "x, %%edi\n" \
   316       "  add %%edi, %%e" #r1 "x\n" \
   317       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   318       "  add $" #constant ", %%edi\n" \
   319       "  add %%edi, %%e" #r1 "x\n" \
   320       "  rol $" #rotate ", %%e" #r1 "x\n" \
   321       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   322 
   323       STEP4 (a, b, c, d, 0, 0xf4292244, 6)
   324       STEP4 (d, a, b, c, 7, 0x432aff97, 10)
   325       STEP4 (c, d, a, b, 14, 0xab9423a7, 15)
   326       STEP4 (b, c, d, a, 5, 0xfc93a039, 21)
   327       STEP4 (a, b, c, d, 12, 0x655b59c3, 6)
   328       STEP4 (d, a, b, c, 3, 0x8f0ccc92, 10)
   329       STEP4 (c, d, a, b, 10, 0xffeff47d, 15)
   330       STEP4 (b, c, d, a, 1, 0x85845dd1, 21)
   331       STEP4 (a, b, c, d, 8, 0x6fa87e4f, 6)
   332       STEP4 (d, a, b, c, 15, 0xfe2ce6e0, 10)
   333       STEP4 (c, d, a, b, 6, 0xa3014314, 15)
   334       STEP4 (b, c, d, a, 13, 0x4e0811a1, 21)
   335       STEP4 (a, b, c, d, 4, 0xf7537e82, 6)
   336       STEP4 (d, a, b, c, 11, 0xbd3af235, 10)
   337       STEP4 (c, d, a, b, 2, 0x2ad7d2bb, 15)
   338       STEP4 (b, c, d, a, 9, 0xeb86d391, 21)
   339 
   340       "  mov (%%ebp), %%edi\n"
   341       "  add %%eax, 0x0(%%edi)\n"
   342       "  add %%ebx, 0x4(%%edi)\n"
   343       "  add %%ecx, 0x8(%%edi)\n"
   344       "  add %%edx, 0xc(%%edi)\n"
   345       "  mov 0xc(%%ebp), %%ebx\n"
   346       "  mov 0x8(%%ebp), %%ebp\n"
   347       :
   348       : "a" (&tmp)
   349       : "esi", "ecx", "edx", "edi", "memory");
   350 #undef STEP1
   351 #undef STEP2
   352 #undef STEP3
   353 #undef STEP4
   354 #endif  
   355 }
   356 OIL_DEFINE_IMPL_ASM (md5_asm2, md5);
   357 
   358 
   359 
   360 #ifdef ENABLE_BROKEN_IMPLS
   361 /* FIXME this is way too clever.  Using %esp as a general purpose
   362  * register?  NOT a brilliant idea. */
   363 static void
   364 md5_asm3(uint32_t *state, uint32_t *src)
   365 {
   366   struct {
   367     void *state;
   368     void *src;
   369     void *ebp;
   370     void *esp;
   371     void *ebx;
   372   }tmp;
   373 
   374   tmp.state = state;
   375   tmp.src = src;
   376 
   377   asm (
   378       "  mov %%ebp, 0x8(%%eax)\n"
   379       "  mov %%esp, 0xc(%%eax)\n"
   380       "  mov %%ebx, 0x10(%%eax)\n"
   381       "  mov %%eax, %%ebp\n"
   382       "  mov (%%ebp), %%esi\n"
   383       "  mov (%%esi), %%eax\n"
   384       "  mov 0x4(%%esi), %%ebx\n"
   385       "  mov 0x8(%%esi), %%ecx\n"
   386       "  mov 0xc(%%esi), %%edx\n"
   387       "  mov 0x4(%%ebp), %%esi\n"
   388 
   389 #define STEP1(r1,r2,r3,r4,offset,constant,rotate) \
   390       "  mov %%e" #r2 "x, %%edi\n" \
   391       "   mov %%e" #r2 "x, %%esp\n" \
   392       "   not %%esp\n" \
   393       "  and %%e" #r3 "x, %%edi\n" \
   394       "   and %%e" #r4 "x, %%esp\n" \
   395       "  or %%esp, %%edi\n" \
   396       "  add %%edi, %%e" #r1 "x\n" \
   397       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   398       "  add $" #constant ", %%edi\n" \
   399       "  add %%edi, %%e" #r1 "x\n" \
   400       "  rol $" #rotate ", %%e" #r1 "x\n" \
   401       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   402 
   403       STEP1 (a, b, c, d, 0, 0xd76aa478, 7)
   404       STEP1 (d, a, b, c, 1, 0xe8c7b756, 12)
   405       STEP1 (c, d, a, b, 2, 0x242070db, 17)
   406       STEP1 (b, c, d, a, 3, 0xc1bdceee, 22)
   407       STEP1 (a, b, c, d, 4, 0xf57c0faf, 7)
   408       STEP1 (d, a, b, c, 5, 0x4787c62a, 12)
   409       STEP1 (c, d, a, b, 6, 0xa8304613, 17)
   410       STEP1 (b, c, d, a, 7, 0xfd469501, 22)
   411       STEP1 (a, b, c, d, 8, 0x698098d8, 7)
   412       STEP1 (d, a, b, c, 9, 0x8b44f7af, 12)
   413       STEP1 (c, d, a, b, 10, 0xffff5bb1, 17)
   414       STEP1 (b, c, d, a, 11, 0x895cd7be, 22)
   415       STEP1 (a, b, c, d, 12, 0x6b901122, 7)
   416       STEP1 (d, a, b, c, 13, 0xfd987193, 12)
   417       STEP1 (c, d, a, b, 14, 0xa679438e, 17)
   418       STEP1 (b, c, d, a, 15, 0x49b40821, 22)
   419       
   420 #define STEP2(r1,r2,r3,r4,offset,constant,rotate) \
   421       "  mov %%e" #r4 "x, %%edi\n" \
   422       "   mov %%e" #r4 "x, %%esp\n" \
   423       "   not %%esp\n" \
   424       "  and %%e" #r2 "x, %%edi\n" \
   425       "   and %%e" #r3 "x, %%esp\n" \
   426       "  or %%esp, %%edi\n" \
   427       "  add %%edi, %%e" #r1 "x\n" \
   428       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   429       "  add $" #constant ", %%edi\n" \
   430       "  add %%edi, %%e" #r1 "x\n" \
   431       "  rol $" #rotate ", %%e" #r1 "x\n" \
   432       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   433 
   434       STEP2(a, b, c, d, 1, 0xf61e2562, 5)
   435       STEP2(d, a, b, c, 6, 0xc040b340, 9)
   436       STEP2(c, d, a, b, 11, 0x265e5a51, 14)
   437       STEP2(b, c, d, a, 0, 0xe9b6c7aa, 20)
   438       STEP2(a, b, c, d, 5, 0xd62f105d, 5)
   439       STEP2(d, a, b, c, 10, 0x02441453, 9)
   440       STEP2(c, d, a, b, 15, 0xd8a1e681, 14)
   441       STEP2(b, c, d, a, 4, 0xe7d3fbc8, 20)
   442       STEP2(a, b, c, d, 9, 0x21e1cde6, 5)
   443       STEP2(d, a, b, c, 14, 0xc33707d6, 9)
   444       STEP2(c, d, a, b, 3, 0xf4d50d87, 14)
   445       STEP2(b, c, d, a, 8, 0x455a14ed, 20)
   446       STEP2(a, b, c, d, 13, 0xa9e3e905, 5)
   447       STEP2(d, a, b, c, 2, 0xfcefa3f8, 9)
   448       STEP2(c, d, a, b, 7, 0x676f02d9, 14)
   449       STEP2(b, c, d, a, 12, 0x8d2a4c8a, 20)
   450 
   451 #define STEP3(r1,r2,r3,r4,offset,constant,rotate) \
   452       "  mov %%e" #r4 "x, %%edi\n" \
   453       "  xor %%e" #r3 "x, %%edi\n" \
   454       "  xor %%e" #r2 "x, %%edi\n" \
   455       "  add %%edi, %%e" #r1 "x\n" \
   456       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   457       "  add $" #constant ", %%edi\n" \
   458       "  add %%edi, %%e" #r1 "x\n" \
   459       "  rol $" #rotate ", %%e" #r1 "x\n" \
   460       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   461 
   462       STEP3 (a, b, c, d, 5, 0xfffa3942, 4)
   463       STEP3 (d, a, b, c, 8, 0x8771f681, 11)
   464       STEP3 (c, d, a, b, 11, 0x6d9d6122, 16)
   465       STEP3 (b, c, d, a, 14, 0xfde5380c, 23)
   466       STEP3 (a, b, c, d, 1, 0xa4beea44, 4)
   467       STEP3 (d, a, b, c, 4, 0x4bdecfa9, 11)
   468       STEP3 (c, d, a, b, 7, 0xf6bb4b60, 16)
   469       STEP3 (b, c, d, a, 10, 0xbebfbc70, 23)
   470       STEP3 (a, b, c, d, 13, 0x289b7ec6, 4)
   471       STEP3 (d, a, b, c, 0, 0xeaa127fa, 11)
   472       STEP3 (c, d, a, b, 3, 0xd4ef3085, 16)
   473       STEP3 (b, c, d, a, 6, 0x04881d05, 23)
   474       STEP3 (a, b, c, d, 9, 0xd9d4d039, 4)
   475       STEP3 (d, a, b, c, 12, 0xe6db99e5, 11)
   476       STEP3 (c, d, a, b, 15, 0x1fa27cf8, 16)
   477       STEP3 (b, c, d, a, 2, 0xc4ac5665, 23)
   478 
   479 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
   480       "  mov %%e" #r4 "x, %%edi\n" \
   481       "  not %%edi\n" \
   482       "  or %%e" #r2 "x, %%edi\n" \
   483       "  xor %%e" #r3 "x, %%edi\n" \
   484       "  add %%edi, %%e" #r1 "x\n" \
   485       "  mov (" #offset "* 4)(%%esi), %%edi\n" \
   486       "  add $" #constant ", %%edi\n" \
   487       "  add %%edi, %%e" #r1 "x\n" \
   488       "  rol $" #rotate ", %%e" #r1 "x\n" \
   489       "  add %%e" #r2 "x, %%e" #r1 "x\n"
   490 
   491       STEP4 (a, b, c, d, 0, 0xf4292244, 6)
   492       STEP4 (d, a, b, c, 7, 0x432aff97, 10)
   493       STEP4 (c, d, a, b, 14, 0xab9423a7, 15)
   494       STEP4 (b, c, d, a, 5, 0xfc93a039, 21)
   495       STEP4 (a, b, c, d, 12, 0x655b59c3, 6)
   496       STEP4 (d, a, b, c, 3, 0x8f0ccc92, 10)
   497       STEP4 (c, d, a, b, 10, 0xffeff47d, 15)
   498       STEP4 (b, c, d, a, 1, 0x85845dd1, 21)
   499       STEP4 (a, b, c, d, 8, 0x6fa87e4f, 6)
   500       STEP4 (d, a, b, c, 15, 0xfe2ce6e0, 10)
   501       STEP4 (c, d, a, b, 6, 0xa3014314, 15)
   502       STEP4 (b, c, d, a, 13, 0x4e0811a1, 21)
   503       STEP4 (a, b, c, d, 4, 0xf7537e82, 6)
   504       STEP4 (d, a, b, c, 11, 0xbd3af235, 10)
   505       STEP4 (c, d, a, b, 2, 0x2ad7d2bb, 15)
   506       STEP4 (b, c, d, a, 9, 0xeb86d391, 21)
   507 
   508       "  mov (%%ebp), %%edi\n"
   509       "  add %%eax, 0x0(%%edi)\n"
   510       "  add %%ebx, 0x4(%%edi)\n"
   511       "  add %%ecx, 0x8(%%edi)\n"
   512       "  add %%edx, 0xc(%%edi)\n"
   513       "  mov 0x10(%%ebp), %%ebx\n"
   514       "  mov 0xc(%%ebp), %%esp\n"
   515       "  mov 0x8(%%ebp), %%ebp\n"
   516       :
   517       : "a" (&tmp)
   518       : "esi", "ecx", "edx", "edi");
   519 #undef STEP1
   520 #undef STEP2
   521 #undef STEP3
   522 #undef STEP4
   523 }
   524 
   525 
   526 OIL_DEFINE_IMPL_ASM (md5_asm3, md5);
   527 #endif
   528 
   529 
   530 
   531 #ifdef	__SYMBIAN32__
   532  
   533 OilFunctionImpl* __oil_function_impl_md5_asm1() {
   534 		return &_oil_function_impl_md5_asm1;
   535 }
   536 #endif
   537 
   538 
   539 
   540 #ifdef	__SYMBIAN32__
   541  
   542 OilFunctionImpl* __oil_function_impl_md5_asm2() {
   543 		return &_oil_function_impl_md5_asm2;
   544 }
   545 #endif
   546 
   547 #ifdef	__SYMBIAN32__
   548  
   549 OilFunctionImpl* __oil_function_impl_md5_asm3() {
   550 		return &_oil_function_impl_md5_asm3;
   551 }
   552 #endif
   553