|
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 |