xref: /plan9/sys/src/libsec/mips/md5block.s (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1*80ee5cbfSDavid du Colombier/*
2*80ee5cbfSDavid du Colombier *  rfc1321 requires that I include this.  The code is new.  The constants
3*80ee5cbfSDavid du Colombier *  all come from the rfc (hence the copyright).  We trade a table for the
4*80ee5cbfSDavid du Colombier *  macros in rfc.  The total size is a lot less. -- presotto
5*80ee5cbfSDavid du Colombier *
6*80ee5cbfSDavid du Colombier *	Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
7*80ee5cbfSDavid du Colombier *	rights reserved.
8*80ee5cbfSDavid du Colombier *
9*80ee5cbfSDavid du Colombier *	License to copy and use this software is granted provided that it
10*80ee5cbfSDavid du Colombier *	is identified as the "RSA Data Security, Inc. MD5 Message-Digest
11*80ee5cbfSDavid du Colombier *	Algorithm" in all material mentioning or referencing this software
12*80ee5cbfSDavid du Colombier *	or this function.
13*80ee5cbfSDavid du Colombier *
14*80ee5cbfSDavid du Colombier *	License is also granted to make and use derivative works provided
15*80ee5cbfSDavid du Colombier *	that such works are identified as "derived from the RSA Data
16*80ee5cbfSDavid du Colombier *	Security, Inc. MD5 Message-Digest Algorithm" in all material
17*80ee5cbfSDavid du Colombier *	mentioning or referencing the derived work.
18*80ee5cbfSDavid du Colombier *
19*80ee5cbfSDavid du Colombier *	RSA Data Security, Inc. makes no representations concerning either
20*80ee5cbfSDavid du Colombier *	the merchantability of this software or the suitability of this
21*80ee5cbfSDavid du Colombier *	software forany particular purpose. It is provided "as is"
22*80ee5cbfSDavid du Colombier *	without express or implied warranty of any kind.
23*80ee5cbfSDavid du Colombier *	These notices must be retained in any copies of any part of this
24*80ee5cbfSDavid du Colombier *	documentation and/or software.
25*80ee5cbfSDavid du Colombier */
26*80ee5cbfSDavid du Colombier
27*80ee5cbfSDavid du Colombier	/* round 1 */
28*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 0*4)(SB)/4,$0xd76aa478
29*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 1*4)(SB)/4,$0xe8c7b756
30*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 2*4)(SB)/4,$0x242070db
31*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 3*4)(SB)/4,$0xc1bdceee
32*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 4*4)(SB)/4,$0xf57c0faf
33*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 5*4)(SB)/4,$0x4787c62a
34*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 6*4)(SB)/4,$0xa8304613
35*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 7*4)(SB)/4,$0xfd469501
36*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 8*4)(SB)/4,$0x698098d8
37*80ee5cbfSDavid du Colombier	DATA	md5tab<>+( 9*4)(SB)/4,$0x8b44f7af
38*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(10*4)(SB)/4,$0xffff5bb1
39*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(11*4)(SB)/4,$0x895cd7be
40*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(12*4)(SB)/4,$0x6b901122
41*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(13*4)(SB)/4,$0xfd987193
42*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(14*4)(SB)/4,$0xa679438e
43*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(15*4)(SB)/4,$0x49b40821
44*80ee5cbfSDavid du Colombier
45*80ee5cbfSDavid du Colombier	/* round 2 */
46*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(16*4)(SB)/4,$0xf61e2562
47*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(17*4)(SB)/4,$0xc040b340
48*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(18*4)(SB)/4,$0x265e5a51
49*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa
50*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(20*4)(SB)/4,$0xd62f105d
51*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(21*4)(SB)/4,$0x02441453
52*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(22*4)(SB)/4,$0xd8a1e681
53*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8
54*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(24*4)(SB)/4,$0x21e1cde6
55*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(25*4)(SB)/4,$0xc33707d6
56*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(26*4)(SB)/4,$0xf4d50d87
57*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(27*4)(SB)/4,$0x455a14ed
58*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(28*4)(SB)/4,$0xa9e3e905
59*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(29*4)(SB)/4,$0xfcefa3f8
60*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(30*4)(SB)/4,$0x676f02d9
61*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a
62*80ee5cbfSDavid du Colombier
63*80ee5cbfSDavid du Colombier	/* round 3 */
64*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(32*4)(SB)/4,$0xfffa3942
65*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(33*4)(SB)/4,$0x8771f681
66*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(34*4)(SB)/4,$0x6d9d6122
67*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(35*4)(SB)/4,$0xfde5380c
68*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(36*4)(SB)/4,$0xa4beea44
69*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(37*4)(SB)/4,$0x4bdecfa9
70*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(38*4)(SB)/4,$0xf6bb4b60
71*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(39*4)(SB)/4,$0xbebfbc70
72*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(40*4)(SB)/4,$0x289b7ec6
73*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(41*4)(SB)/4,$0xeaa127fa
74*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(42*4)(SB)/4,$0xd4ef3085
75*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(43*4)(SB)/4,$0x04881d05
76*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(44*4)(SB)/4,$0xd9d4d039
77*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(45*4)(SB)/4,$0xe6db99e5
78*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(46*4)(SB)/4,$0x1fa27cf8
79*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(47*4)(SB)/4,$0xc4ac5665
80*80ee5cbfSDavid du Colombier
81*80ee5cbfSDavid du Colombier	/* round 4 */
82*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(48*4)(SB)/4,$0xf4292244
83*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(49*4)(SB)/4,$0x432aff97
84*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(50*4)(SB)/4,$0xab9423a7
85*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(51*4)(SB)/4,$0xfc93a039
86*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(52*4)(SB)/4,$0x655b59c3
87*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(53*4)(SB)/4,$0x8f0ccc92
88*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(54*4)(SB)/4,$0xffeff47d
89*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(55*4)(SB)/4,$0x85845dd1
90*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(56*4)(SB)/4,$0x6fa87e4f
91*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0
92*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(58*4)(SB)/4,$0xa3014314
93*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(59*4)(SB)/4,$0x4e0811a1
94*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(60*4)(SB)/4,$0xf7537e82
95*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(61*4)(SB)/4,$0xbd3af235
96*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb
97*80ee5cbfSDavid du Colombier	DATA	md5tab<>+(63*4)(SB)/4,$0xeb86d391
98*80ee5cbfSDavid du Colombier
99*80ee5cbfSDavid du Colombier#define S11 7
100*80ee5cbfSDavid du Colombier#define S12 12
101*80ee5cbfSDavid du Colombier#define S13 17
102*80ee5cbfSDavid du Colombier#define S14 22
103*80ee5cbfSDavid du Colombier
104*80ee5cbfSDavid du Colombier#define S21 5
105*80ee5cbfSDavid du Colombier#define S22 9
106*80ee5cbfSDavid du Colombier#define S23 14
107*80ee5cbfSDavid du Colombier#define S24 20
108*80ee5cbfSDavid du Colombier
109*80ee5cbfSDavid du Colombier#define S31 4
110*80ee5cbfSDavid du Colombier#define S32 11
111*80ee5cbfSDavid du Colombier#define S33 16
112*80ee5cbfSDavid du Colombier#define S34 23
113*80ee5cbfSDavid du Colombier
114*80ee5cbfSDavid du Colombier#define S41 6
115*80ee5cbfSDavid du Colombier#define S42 10
116*80ee5cbfSDavid du Colombier#define S43 15
117*80ee5cbfSDavid du Colombier#define S44 21
118*80ee5cbfSDavid du Colombier
119*80ee5cbfSDavid du Colombier#define	AREG		R5
120*80ee5cbfSDavid du Colombier#define BREG		R6
121*80ee5cbfSDavid du Colombier#define CREG		R7
122*80ee5cbfSDavid du Colombier#define DREG		R8
123*80ee5cbfSDavid du Colombier#define DATAREG		R1
124*80ee5cbfSDavid du Colombier#define TABREG		R10
125*80ee5cbfSDavid du Colombier#define STREG		R11
126*80ee5cbfSDavid du Colombier#define XREG		R12
127*80ee5cbfSDavid du Colombier#define ELOOPREG	R13
128*80ee5cbfSDavid du Colombier#define EDREG		R14
129*80ee5cbfSDavid du Colombier#define IREG		R15
130*80ee5cbfSDavid du Colombier
131*80ee5cbfSDavid du Colombier#define TMP1		R9
132*80ee5cbfSDavid du Colombier#define TMP2		R2
133*80ee5cbfSDavid du Colombier#define TMP3		R3
134*80ee5cbfSDavid du Colombier#define TMP4		R4
135*80ee5cbfSDavid du Colombier
136*80ee5cbfSDavid du Colombier/*
137*80ee5cbfSDavid du Colombier * decode little endian data into x[off], then the body
138*80ee5cbfSDavid du Colombier * bodies have this form:
139*80ee5cbfSDavid du Colombier *	a += FN(B,C,D);
140*80ee5cbfSDavid du Colombier *	a += x[off] + t[off];
141*80ee5cbfSDavid du Colombier *	a = (a << S11) | (a >> (32 - S11));
142*80ee5cbfSDavid du Colombier *	a += b;
143*80ee5cbfSDavid du Colombier */
144*80ee5cbfSDavid du Colombier#define BODY1(off,FN,SH,A,B,C,D)\
145*80ee5cbfSDavid du Colombier	MOVBU off(DATAREG),TMP2;\
146*80ee5cbfSDavid du Colombier	MOVBU (off+1)(DATAREG),TMP3;\
147*80ee5cbfSDavid du Colombier	MOVBU (off+2)(DATAREG),TMP1;\
148*80ee5cbfSDavid du Colombier	MOVBU (off+3)(DATAREG),TMP4;\
149*80ee5cbfSDavid du Colombier	SLL $8,TMP3;\
150*80ee5cbfSDavid du Colombier	OR TMP3,TMP2;\
151*80ee5cbfSDavid du Colombier	SLL $16,TMP1;\
152*80ee5cbfSDavid du Colombier	OR TMP1,TMP2;\
153*80ee5cbfSDavid du Colombier	SLL $24,TMP4;\
154*80ee5cbfSDavid du Colombier	OR TMP4,TMP2;\
155*80ee5cbfSDavid du Colombier	MOVW off(TABREG),TMP3;\
156*80ee5cbfSDavid du Colombier	FN(B,C,D)\
157*80ee5cbfSDavid du Colombier	ADDU TMP1,A;\
158*80ee5cbfSDavid du Colombier	MOVW TMP2,off(XREG);\
159*80ee5cbfSDavid du Colombier	ADDU TMP2,A;\
160*80ee5cbfSDavid du Colombier	ADDU TMP3,A;\
161*80ee5cbfSDavid du Colombier	SLL $SH,A,TMP1;\
162*80ee5cbfSDavid du Colombier	SRL $(32-SH),A;\
163*80ee5cbfSDavid du Colombier	OR TMP1,A;\
164*80ee5cbfSDavid du Colombier	ADDU B,A;\
165*80ee5cbfSDavid du Colombier
166*80ee5cbfSDavid du Colombier#define BODY(off,inc,FN,SH,A,B,C,D)\
167*80ee5cbfSDavid du Colombier	MOVW off(TABREG),TMP3;\
168*80ee5cbfSDavid du Colombier	ADDU XREG,IREG,TMP4;\
169*80ee5cbfSDavid du Colombier	MOVW (TMP4),TMP2;\
170*80ee5cbfSDavid du Colombier	ADDU $(inc*4),IREG;\
171*80ee5cbfSDavid du Colombier	AND $63,IREG;\
172*80ee5cbfSDavid du Colombier	FN(B,C,D)\
173*80ee5cbfSDavid du Colombier	ADDU TMP1,A;\
174*80ee5cbfSDavid du Colombier	ADDU TMP2,A;\
175*80ee5cbfSDavid du Colombier	ADDU TMP3,A;\
176*80ee5cbfSDavid du Colombier	SLL $SH,A,TMP1;\
177*80ee5cbfSDavid du Colombier	SRL $(32-SH),A;\
178*80ee5cbfSDavid du Colombier	OR  TMP1,A;\
179*80ee5cbfSDavid du Colombier	ADDU B,A;\
180*80ee5cbfSDavid du Colombier
181*80ee5cbfSDavid du Colombier/*
182*80ee5cbfSDavid du Colombier * fn1 = ((c ^ d) & b) ^ d
183*80ee5cbfSDavid du Colombier */
184*80ee5cbfSDavid du Colombier#define FN1(B,C,D)\
185*80ee5cbfSDavid du Colombier	XOR C,D,TMP1;\
186*80ee5cbfSDavid du Colombier	AND B,TMP1;\
187*80ee5cbfSDavid du Colombier	XOR D,TMP1;\
188*80ee5cbfSDavid du Colombier
189*80ee5cbfSDavid du Colombier/*
190*80ee5cbfSDavid du Colombier * fn2 = ((b ^ c) & d) ^ c;
191*80ee5cbfSDavid du Colombier */
192*80ee5cbfSDavid du Colombier#define FN2(B,C,D)\
193*80ee5cbfSDavid du Colombier	XOR B,C,TMP1;\
194*80ee5cbfSDavid du Colombier	AND D,TMP1;\
195*80ee5cbfSDavid du Colombier	XOR C,TMP1;\
196*80ee5cbfSDavid du Colombier
197*80ee5cbfSDavid du Colombier/*
198*80ee5cbfSDavid du Colombier * fn3 = b ^ c ^ d;
199*80ee5cbfSDavid du Colombier */
200*80ee5cbfSDavid du Colombier#define FN3(B,C,D)\
201*80ee5cbfSDavid du Colombier	XOR B,C,TMP1;\
202*80ee5cbfSDavid du Colombier	XOR D,TMP1;\
203*80ee5cbfSDavid du Colombier
204*80ee5cbfSDavid du Colombier/*
205*80ee5cbfSDavid du Colombier * fn4 = c ^ (b | ~d);
206*80ee5cbfSDavid du Colombier */
207*80ee5cbfSDavid du Colombier#define FN4(B,C,D)\
208*80ee5cbfSDavid du Colombier	XOR $-1,D,TMP1;\
209*80ee5cbfSDavid du Colombier	OR B,TMP1;\
210*80ee5cbfSDavid du Colombier	XOR C,TMP1;\
211*80ee5cbfSDavid du Colombier
212*80ee5cbfSDavid du Colombier#define	DATA	0
213*80ee5cbfSDavid du Colombier#define	LEN	4
214*80ee5cbfSDavid du Colombier#define	STATE	8
215*80ee5cbfSDavid du Colombier
216*80ee5cbfSDavid du Colombier#define XOFF	(-4-16*4)
217*80ee5cbfSDavid du Colombier
218*80ee5cbfSDavid du Colombier	TEXT	_md5block+0(SB),$68
219*80ee5cbfSDavid du Colombier
220*80ee5cbfSDavid du Colombier	MOVW	len+LEN(FP),TMP1
221*80ee5cbfSDavid du Colombier	ADDU	DATAREG,TMP1,EDREG
222*80ee5cbfSDavid du Colombier	MOVW	state+STATE(FP),STREG
223*80ee5cbfSDavid du Colombier
224*80ee5cbfSDavid du Colombier	MOVW 0(STREG),AREG
225*80ee5cbfSDavid du Colombier	MOVW 4(STREG),BREG
226*80ee5cbfSDavid du Colombier	MOVW 8(STREG),CREG
227*80ee5cbfSDavid du Colombier	MOVW 12(STREG),DREG
228*80ee5cbfSDavid du Colombier
229*80ee5cbfSDavid du Colombiermainloop:
230*80ee5cbfSDavid du Colombier
231*80ee5cbfSDavid du Colombier	MOVW $md5tab<>+0(SB),TABREG
232*80ee5cbfSDavid du Colombier	ADDU $(16*4),DATAREG,ELOOPREG
233*80ee5cbfSDavid du Colombier	MOVW $x+XOFF(SP),XREG
234*80ee5cbfSDavid du Colombier
235*80ee5cbfSDavid du Colombierloop1:
236*80ee5cbfSDavid du Colombier	BODY1(0,FN1,S11,AREG,BREG,CREG,DREG)
237*80ee5cbfSDavid du Colombier	BODY1(4,FN1,S12,DREG,AREG,BREG,CREG)
238*80ee5cbfSDavid du Colombier	BODY1(8,FN1,S13,CREG,DREG,AREG,BREG)
239*80ee5cbfSDavid du Colombier	BODY1(12,FN1,S14,BREG,CREG,DREG,AREG)
240*80ee5cbfSDavid du Colombier
241*80ee5cbfSDavid du Colombier	ADDU $16,DATAREG
242*80ee5cbfSDavid du Colombier	ADDU $16,TABREG
243*80ee5cbfSDavid du Colombier	ADDU $16,XREG
244*80ee5cbfSDavid du Colombier
245*80ee5cbfSDavid du Colombier	BNE DATAREG,ELOOPREG,loop1
246*80ee5cbfSDavid du Colombier
247*80ee5cbfSDavid du Colombier
248*80ee5cbfSDavid du Colombier	MOVW $x+XOFF(SP),XREG
249*80ee5cbfSDavid du Colombier	MOVW $(1*4),IREG
250*80ee5cbfSDavid du Colombier	MOVW $(1*4),ELOOPREG
251*80ee5cbfSDavid du Colombierloop2:
252*80ee5cbfSDavid du Colombier	BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG)
253*80ee5cbfSDavid du Colombier	BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG)
254*80ee5cbfSDavid du Colombier	BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG)
255*80ee5cbfSDavid du Colombier	BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG)
256*80ee5cbfSDavid du Colombier
257*80ee5cbfSDavid du Colombier	ADDU $16,TABREG
258*80ee5cbfSDavid du Colombier
259*80ee5cbfSDavid du Colombier	BNE IREG,ELOOPREG,loop2
260*80ee5cbfSDavid du Colombier
261*80ee5cbfSDavid du Colombier
262*80ee5cbfSDavid du Colombier	MOVW $(5*4),IREG
263*80ee5cbfSDavid du Colombier	MOVW $(5*4),ELOOPREG
264*80ee5cbfSDavid du Colombierloop3:
265*80ee5cbfSDavid du Colombier	BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG)
266*80ee5cbfSDavid du Colombier	BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG)
267*80ee5cbfSDavid du Colombier	BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG)
268*80ee5cbfSDavid du Colombier	BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG)
269*80ee5cbfSDavid du Colombier
270*80ee5cbfSDavid du Colombier	ADDU $16,TABREG
271*80ee5cbfSDavid du Colombier
272*80ee5cbfSDavid du Colombier	BNE IREG,ELOOPREG,loop3
273*80ee5cbfSDavid du Colombier
274*80ee5cbfSDavid du Colombier
275*80ee5cbfSDavid du Colombier	MOVW $0,IREG
276*80ee5cbfSDavid du Colombierloop4:
277*80ee5cbfSDavid du Colombier	BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG)
278*80ee5cbfSDavid du Colombier	BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG)
279*80ee5cbfSDavid du Colombier	BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG)
280*80ee5cbfSDavid du Colombier	BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG)
281*80ee5cbfSDavid du Colombier
282*80ee5cbfSDavid du Colombier	ADDU $16,TABREG
283*80ee5cbfSDavid du Colombier
284*80ee5cbfSDavid du Colombier	BNE IREG,R0,loop4
285*80ee5cbfSDavid du Colombier
286*80ee5cbfSDavid du Colombier	MOVW 0(STREG),TMP1
287*80ee5cbfSDavid du Colombier	MOVW 4(STREG),TMP2
288*80ee5cbfSDavid du Colombier	MOVW 8(STREG),TMP3
289*80ee5cbfSDavid du Colombier	MOVW 12(STREG),TMP4
290*80ee5cbfSDavid du Colombier	ADDU TMP1,AREG
291*80ee5cbfSDavid du Colombier	ADDU TMP2,BREG
292*80ee5cbfSDavid du Colombier	ADDU TMP3,CREG
293*80ee5cbfSDavid du Colombier	ADDU TMP4,DREG
294*80ee5cbfSDavid du Colombier	MOVW AREG,0(STREG)
295*80ee5cbfSDavid du Colombier	MOVW BREG,4(STREG)
296*80ee5cbfSDavid du Colombier	MOVW CREG,8(STREG)
297*80ee5cbfSDavid du Colombier	MOVW DREG,12(STREG)
298*80ee5cbfSDavid du Colombier
299*80ee5cbfSDavid du Colombier	BNE DATAREG,EDREG,mainloop
300*80ee5cbfSDavid du Colombier
301*80ee5cbfSDavid du Colombier	RET
302*80ee5cbfSDavid du Colombier
303*80ee5cbfSDavid du Colombier	GLOBL	md5tab<>+0(SB),$256
304*80ee5cbfSDavid du Colombier
305*80ee5cbfSDavid du Colombier	END
306