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