genericopenlibs/liboil/src/i386/md5_i386.c
changeset 18 47c74d1534e1
equal deleted inserted replaced
0:e4d67989cc36 18:47c74d1534e1
       
     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