First public contribution.
2 * LIBOIL - Library of Optimized Inner Loops
3 * Copyright (c) 2004 David A. Schleef <ds@schleef.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
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.
27 //Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
33 #include <liboil/liboilfunction.h>
34 #include <liboil/liboilclasses.h>
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))
42 #define MD5STEP(f,w,x,y,z,in,s) \
43 (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
47 md5_asm1(uint32_t *state, uint32_t *src)
49 #if !defined(__WINSCW__) && !defined(__WINS__)
60 __asm__ __volatile__ (
61 " mov %%ebp, 0x8(%%eax)\n"
62 " mov %%ebx, 0xc(%%eax)\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"
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"
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)
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"
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)
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"
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)
154 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
155 " mov %%e" #r4 "x, %%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"
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)
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"
191 : "esi", "ecx", "edx", "edi", "memory");
198 OIL_DEFINE_IMPL (md5_asm1, md5);
201 md5_asm2(uint32_t *state, uint32_t *src)
203 #if !defined(__WINSCW__) && !defined(__WINS__)
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"
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"
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)
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"
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)
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"
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)
311 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
312 " mov %%e" #r4 "x, %%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"
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)
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"
349 : "esi", "ecx", "edx", "edi", "memory");
356 OIL_DEFINE_IMPL_ASM (md5_asm2, md5);
360 #ifdef ENABLE_BROKEN_IMPLS
361 /* FIXME this is way too clever. Using %esp as a general purpose
362 * register? NOT a brilliant idea. */
364 md5_asm3(uint32_t *state, uint32_t *src)
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"
389 #define STEP1(r1,r2,r3,r4,offset,constant,rotate) \
390 " mov %%e" #r2 "x, %%edi\n" \
391 " mov %%e" #r2 "x, %%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"
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)
420 #define STEP2(r1,r2,r3,r4,offset,constant,rotate) \
421 " mov %%e" #r4 "x, %%edi\n" \
422 " mov %%e" #r4 "x, %%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"
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)
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"
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)
479 #define STEP4(r1,r2,r3,r4,offset,constant,rotate) \
480 " mov %%e" #r4 "x, %%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"
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)
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"
518 : "esi", "ecx", "edx", "edi");
526 OIL_DEFINE_IMPL_ASM (md5_asm3, md5);
533 OilFunctionImpl* __oil_function_impl_md5_asm1() {
534 return &_oil_function_impl_md5_asm1;
542 OilFunctionImpl* __oil_function_impl_md5_asm2() {
543 return &_oil_function_impl_md5_asm2;
549 OilFunctionImpl* __oil_function_impl_md5_asm3() {
550 return &_oil_function_impl_md5_asm3;