sha1-586.pl revision 72613
1101099Srwatson#!/usr/local/bin/perl
2184467Srwatson
3145412Strhodes$normal=0;
4171253Srwatson
5172930Srwatsonpush(@INC,"perlasm","../../perlasm");
6101099Srwatsonrequire "x86asm.pl";
7101099Srwatson
8101099Srwatson&asm_init($ARGV[0],"sha1-586.pl",$ARGV[$#ARGV] eq "386");
9145412Strhodes
10101099Srwatson$A="eax";
11106393Srwatson$B="ecx";
12106393Srwatson$C="ebx";
13106393Srwatson$D="edx";
14106393Srwatson$E="edi";
15101099Srwatson$T="esi";
16172930Srwatson$tmp1="ebp";
17172930Srwatson
18172930Srwatson$off=9*4;
19101099Srwatson
20101099Srwatson@K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6);
21101099Srwatson
22101099Srwatson&sha1_block_data("sha1_block_asm_data_order");
23101099Srwatson
24101099Srwatson&asm_finish();
25101099Srwatson
26101099Srwatsonsub Nn
27101099Srwatson	{
28101099Srwatson	local($p)=@_;
29101099Srwatson	local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E);
30101099Srwatson	return($n{$p});
31101099Srwatson	}
32101099Srwatson
33101099Srwatsonsub Np
34101099Srwatson	{
35101099Srwatson	local($p)=@_;
36101099Srwatson	local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E);
37101099Srwatson	local(%n)=($A,$B,$B,$C,$C,$D,$D,$E,$E,$T,$T,$A);
38101099Srwatson	return($n{$p});
39101099Srwatson	}
40101099Srwatson
41101099Srwatsonsub Na
42136774Srwatson	{
43101099Srwatson	local($n)=@_;
44101099Srwatson	return( (($n   )&0x0f),
45101099Srwatson		(($n+ 2)&0x0f),
46157986Sdwmalone		(($n+ 8)&0x0f),
47145412Strhodes		(($n+13)&0x0f),
48101099Srwatson		(($n+ 1)&0x0f));
49166905Srwatson	}
50101099Srwatson
51145412Strhodessub X_expand
52170689Srwatson	{
53101099Srwatson	local($in)=@_;
54101099Srwatson
55101099Srwatson	&comment("First, load the words onto the stack in network byte order");
56134132Strhodes	for ($i=0; $i<16; $i+=2)
57182905Strasz		{
58101099Srwatson		&mov($A,&DWP(($i+0)*4,$in,"",0));# unless $i == 0;
59165469Srwatson		 &mov($B,&DWP(($i+1)*4,$in,"",0));
60101099Srwatson		&bswap($A);
61184331Srwatson		 &bswap($B);
62101099Srwatson		&mov(&swtmp($i+0),$A);
63184331Srwatson		 &mov(&swtmp($i+1),$B);
64172955Srwatson		}
65184413Strasz
66101099Srwatson	&comment("We now have the X array on the stack");
67101099Srwatson	&comment("starting at sp-4");
68184467Srwatson	}
69101099Srwatson
70101099Srwatson# Rules of engagement
71184331Srwatson# F is always trashable at the start, the running total.
72172955Srwatson# E becomes the next F so it can be trashed after it has been 'accumulated'
73168976Srwatson# F becomes A in the next round.  We don't need to access it much.
74101099Srwatson# During the X update part, the result ends up in $X[$n0].
75101099Srwatson
76172955Srwatsonsub BODY_00_15
77101099Srwatson	{
78101099Srwatson	local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_;
79184331Srwatson
80172955Srwatsonreturn if $n & 1;
81168976Srwatson	&comment("00_15 $n");
82101099Srwatson
83101099Srwatson	 &mov($f,$c);
84172955Srwatson
85101099Srwatson	&mov($tmp1,$a);
86101099Srwatson	 &xor($f,$d);			# F2
87184331Srwatson
88172955Srwatson	&rotl($tmp1,5);			# A2
89168976Srwatson
90101099Srwatson	&and($f,$b);			# F3
91101099Srwatson	 &add($tmp1,$e);
92172955Srwatson
93101099Srwatson	&rotr($b,1);			# B1	<- F
94101099Srwatson	 &mov($e,&swtmp($n));		# G1
95184331Srwatson
96172955Srwatson	&rotr($b,1);			# B1	<- F
97168976Srwatson	 &xor($f,$d);			# F4
98101099Srwatson
99101099Srwatson	&lea($tmp1,&DWP($K,$tmp1,$e,1));
100172955Srwatson
101101099Srwatson############################
102101099Srwatson#	&BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T);
103184331Srwatson#	&BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E);
104172955Srwatson$n++;
105172955Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
106119202Srwatson	($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f);
107119202Srwatson
108172955Srwatson	 &mov($f,$c);
109119202Srwatson
110119202Srwatson	&add($a,$tmp1);		# MOVED DOWN
111184331Srwatson	 &xor($f,$d);			# F2
112172955Srwatson
113168976Srwatson	&mov($tmp1,$a);
114106648Srwatson	 &and($f,$b);			# F3
115101099Srwatson
116101099Srwatson	&rotl($tmp1,5);			# A2
117172955Srwatson
118101099Srwatson	&add($tmp1,$e);
119101099Srwatson	 &mov($e,&swtmp($n));		# G1
120184331Srwatson
121172955Srwatson	&rotr($b,1);			# B1	<- F
122168976Srwatson	 &xor($f,$d);			# F4
123101099Srwatson
124101099Srwatson	&rotr($b,1);			# B1	<- F
125172955Srwatson	 &lea($tmp1,&DWP($K,$tmp1,$e,1));
126101099Srwatson
127101099Srwatson	&add($f,$tmp1);
128184331Srwatson	}
129172955Srwatson
130189533Srwatsonsub BODY_16_19
131101099Srwatson	{
132101099Srwatson	local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_;
133172955Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
134101099Srwatson
135101099Srwatsonreturn if $n & 1;
136184331Srwatson	&comment("16_19 $n");
137172955Srwatson
138168976Srwatson &nop() if ($pos < 0);
139104530Srwatson&mov($tmp1,&swtmp($n0));			# X1
140104530Srwatson &mov($f,&swtmp($n1));			# X2
141104530Srwatson&xor($f,$tmp1);				# X3
142104530Srwatson &mov($tmp1,&swtmp($n2));		# X4
143172955Srwatson&xor($f,$tmp1);				# X5
144104530Srwatson &mov($tmp1,&swtmp($n3));		# X6
145104530Srwatson&xor($f,$tmp1);				# X7 - slot
146172955Srwatson &mov($tmp1,$c);			# F1
147104530Srwatson&rotl($f,1);				# X8 - slot
148104530Srwatson &xor($tmp1,$d);			# F2
149104530Srwatson&mov(&swtmp($n0),$f);			# X9 - anytime
150104530Srwatson &and($tmp1,$b);			# F3
151104530Srwatson&lea($f,&DWP($K,$f,$e,1));		# tot=X+K+e
152184331Srwatson &xor($tmp1,$d);				# F4
153172955Srwatson&mov($e,$a);				# A1
154168976Srwatson &add($f,$tmp1);			# tot+=F();
155119202Srwatson
156119202Srwatson&rotl($e,5);				# A2
157172955Srwatson
158119202Srwatson&rotr($b,1);				# B1	<- F
159119202Srwatson &add($f,$e);				# tot+=a
160184331Srwatson
161172955Srwatson############################
162168976Srwatson#	&BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T);
163101099Srwatson#	&BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E);
164117247Srwatson$n++;
165172955Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
166101099Srwatson	($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f);
167101099Srwatson
168184331Srwatson
169172955Srwatson&mov($f,&swtmp($n0));			# X1
170184413Strasz &mov($tmp1,&swtmp($n1));		# X2
171101099Srwatson&xor($f,$tmp1);				# X3
172101099Srwatson &mov($tmp1,&swtmp($n2));		# X4
173184467Srwatson&xor($f,$tmp1);				# X5
174101099Srwatson &mov($tmp1,&swtmp($n3));		# X6
175101099Srwatson&rotr($c,1); #&rotr($b,1);		# B1	<- F # MOVED DOWN
176184331Srwatson &xor($f,$tmp1);				# X7 - slot
177172955Srwatson&rotl($f,1);				# X8 - slot
178168976Srwatson &mov($tmp1,$c);			# F1
179101099Srwatson&xor($tmp1,$d);			# F2
180101099Srwatson &mov(&swtmp($n0),$f);			# X9 - anytime
181172955Srwatson&and($tmp1,$b);			# F3
182101099Srwatson &lea($f,&DWP($K,$f,$e,1));		# tot=X+K+e
183101099Srwatson
184184331Srwatson&xor($tmp1,$d);				# F4
185172955Srwatson &mov($e,$a);				# A1
186168976Srwatson
187101099Srwatson&rotl($e,5);				# A2
188101099Srwatson
189172955Srwatson&rotr($b,1);				# B1	<- F
190101099Srwatson &add($f,$e);				# tot+=a
191101099Srwatson
192184331Srwatson&rotr($b,1);				# B1	<- F
193172955Srwatson &add($f,$tmp1);			# tot+=F();
194168976Srwatson
195101099Srwatson	}
196101099Srwatson
197101099Srwatsonsub BODY_20_39
198101099Srwatson	{
199172955Srwatson	local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_;
200101099Srwatson
201101099Srwatson	&comment("20_39 $n");
202172955Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
203101099Srwatson
204101099Srwatson&mov($f,&swtmp($n0));			# X1
205184331Srwatson &mov($tmp1,&swtmp($n1));		# X2
206172955Srwatson&xor($f,$tmp1);				# X3
207168976Srwatson &mov($tmp1,&swtmp($n2));		# X4
208168976Srwatson&xor($f,$tmp1);				# X5
209101099Srwatson &mov($tmp1,&swtmp($n3));		# X6
210101099Srwatson&xor($f,$tmp1);				# X7 - slot
211101099Srwatson &mov($tmp1,$b);			# F1
212172955Srwatson&rotl($f,1);				# X8 - slot
213101099Srwatson &xor($tmp1,$c);			# F2
214101099Srwatson&mov(&swtmp($n0),$f);			# X9 - anytime
215156300Sdwmalone &xor($tmp1,$d);			# F3
216172955Srwatson
217101099Srwatson&lea($f,&DWP($K,$f,$e,1));		# tot=X+K+e
218101099Srwatson &mov($e,$a);				# A1
219101099Srwatson
220184331Srwatson&rotl($e,5);				# A2
221172955Srwatson
222168976Srwatsonif ($n != 79) # last loop
223101099Srwatson	{
224101099Srwatson	&rotr($b,1);				# B1	<- F
225172955Srwatson	 &add($e,$tmp1);			# tmp1=F()+a
226101099Srwatson
227101099Srwatson	&rotr($b,1);				# B2	<- F
228184331Srwatson	 &add($f,$e);				# tot+=tmp1;
229172955Srwatson	}
230168976Srwatsonelse
231101099Srwatson	{
232101099Srwatson	&add($e,$tmp1);				# tmp1=F()+a
233172955Srwatson	 &mov($tmp1,&wparam(0));
234101099Srwatson
235101099Srwatson	&rotr($b,1);				# B1	<- F
236184331Srwatson	 &add($f,$e);				# tot+=tmp1;
237172955Srwatson
238189533Srwatson	&rotr($b,1);				# B2	<- F
239101099Srwatson	}
240101099Srwatson	}
241172955Srwatson
242101099Srwatsonsub BODY_40_59
243101099Srwatson	{
244184331Srwatson	local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_;
245172955Srwatson
246168976Srwatson	&comment("40_59 $n");
247101099Srwatson	return if $n & 1;
248101099Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
249172955Srwatson
250101099Srwatson&mov($f,&swtmp($n0));			# X1
251101099Srwatson &mov($tmp1,&swtmp($n1));		# X2
252184331Srwatson&xor($f,$tmp1);				# X3
253172955Srwatson &mov($tmp1,&swtmp($n2));		# X4
254168976Srwatson&xor($f,$tmp1);				# X5
255101099Srwatson &mov($tmp1,&swtmp($n3));		# X6
256101099Srwatson&xor($f,$tmp1);				# X7 - slot
257172955Srwatson &mov($tmp1,$b);			# F1
258101099Srwatson&rotl($f,1);				# X8 - slot
259101099Srwatson &or($tmp1,$c);				# F2
260184331Srwatson&mov(&swtmp($n0),$f);			# X9 - anytime
261172955Srwatson &and($tmp1,$d);			# F3
262168976Srwatson
263101099Srwatson&lea($f,&DWP($K,$f,$e,1));		# tot=X+K+e
264101099Srwatson &mov($e,$b);				# F4
265172955Srwatson
266101099Srwatson&rotr($b,1);				# B1	<- F
267101099Srwatson &and($e,$c);				# F5
268184331Srwatson
269172955Srwatson&or($tmp1,$e);				# F6
270168976Srwatson &mov($e,$a);				# A1
271101099Srwatson
272101099Srwatson&rotl($e,5);				# A2
273172955Srwatson
274101099Srwatson&add($tmp1,$e);			# tmp1=F()+a
275101099Srwatson
276184331Srwatson############################
277172955Srwatson#	&BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T);
278168976Srwatson#	&BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E);
279101099Srwatson$n++;
280101099Srwatson	local($n0,$n1,$n2,$n3,$np)=&Na($n);
281172955Srwatson	($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f);
282101099Srwatson
283101099Srwatson &mov($f,&swtmp($n0));			# X1
284184331Srwatson&add($a,$tmp1);				# tot+=tmp1; # moved was add f,tmp1
285172955Srwatson &mov($tmp1,&swtmp($n1));		# X2
286172107Srwatson&xor($f,$tmp1);				# X3
287172107Srwatson &mov($tmp1,&swtmp($n2));		# X4
288172107Srwatson&xor($f,$tmp1);				# X5
289172107Srwatson &mov($tmp1,&swtmp($n3));		# X6
290172107Srwatson&rotr($c,1);				# B2	<- F # moved was rotr b,1
291172955Srwatson &xor($f,$tmp1);			# X7 - slot
292172107Srwatson&rotl($f,1);				# X8 - slot
293172107Srwatson &mov($tmp1,$b);			# F1
294172955Srwatson&mov(&swtmp($n0),$f);			# X9 - anytime
295172107Srwatson &or($tmp1,$c);				# F2
296&lea($f,&DWP($K,$f,$e,1));		# tot=X+K+e
297 &mov($e,$b);				# F4
298&and($tmp1,$d);				# F3
299 &and($e,$c);				# F5
300
301&or($tmp1,$e);				# F6
302 &mov($e,$a);				# A1
303
304&rotl($e,5);				# A2
305
306&rotr($b,1);				# B1	<- F
307 &add($tmp1,$e);			# tmp1=F()+a
308
309&rotr($b,1);				# B2	<- F
310 &add($f,$tmp1);			# tot+=tmp1;
311	}
312
313sub BODY_60_79
314	{
315	&BODY_20_39(@_);
316	}
317
318sub sha1_block_host
319	{
320	local($name, $sclabel)=@_;
321
322	&function_begin_B($name,"");
323
324	# parameter 1 is the MD5_CTX structure.
325	# A	0
326	# B	4
327	# C	8
328	# D 	12
329	# E 	16
330
331	&mov("ecx",	&wparam(2));
332	 &push("esi");
333	&shl("ecx",6);
334	 &mov("esi",	&wparam(1));
335	&push("ebp");
336	 &add("ecx","esi");	# offset to leave on
337	&push("ebx");
338	 &mov("ebp",	&wparam(0));
339	&push("edi");
340	 &mov($D,	&DWP(12,"ebp","",0));
341	&stack_push(18+9);
342	 &mov($E,	&DWP(16,"ebp","",0));
343	&mov($C,	&DWP( 8,"ebp","",0));
344	 &mov(&swtmp(17),"ecx");
345
346	&comment("First we need to setup the X array");
347
348	for ($i=0; $i<16; $i+=2)
349		{
350		&mov($A,&DWP(($i+0)*4,"esi","",0));# unless $i == 0;
351		 &mov($B,&DWP(($i+1)*4,"esi","",0));
352		&mov(&swtmp($i+0),$A);
353		 &mov(&swtmp($i+1),$B);
354		}
355	&jmp($sclabel);
356	&function_end_B($name);
357	}
358
359
360sub sha1_block_data
361	{
362	local($name)=@_;
363
364	&function_begin_B($name,"");
365
366	# parameter 1 is the MD5_CTX structure.
367	# A	0
368	# B	4
369	# C	8
370	# D 	12
371	# E 	16
372
373	&mov("ecx",	&wparam(2));
374	 &push("esi");
375	&shl("ecx",6);
376	 &mov("esi",	&wparam(1));
377	&push("ebp");
378	 &add("ecx","esi");	# offset to leave on
379	&push("ebx");
380	 &mov("ebp",	&wparam(0));
381	&push("edi");
382	 &mov($D,	&DWP(12,"ebp","",0));
383	&stack_push(18+9);
384	 &mov($E,	&DWP(16,"ebp","",0));
385	&mov($C,	&DWP( 8,"ebp","",0));
386	 &mov(&swtmp(17),"ecx");
387
388	&comment("First we need to setup the X array");
389
390	&set_label("start") unless $normal;
391
392	&X_expand("esi");
393	 &mov(&wparam(1),"esi");
394
395	&set_label("shortcut", 0, 1);
396	&comment("");
397	&comment("Start processing");
398
399	# odd start
400	&mov($A,	&DWP( 0,"ebp","",0));
401	 &mov($B,	&DWP( 4,"ebp","",0));
402	$X="esp";
403	&BODY_00_15(-2,$K[0],$X, 0,$A,$B,$C,$D,$E,$T);
404	&BODY_00_15( 0,$K[0],$X, 1,$T,$A,$B,$C,$D,$E);
405	&BODY_00_15( 0,$K[0],$X, 2,$E,$T,$A,$B,$C,$D);
406	&BODY_00_15( 0,$K[0],$X, 3,$D,$E,$T,$A,$B,$C);
407	&BODY_00_15( 0,$K[0],$X, 4,$C,$D,$E,$T,$A,$B);
408	&BODY_00_15( 0,$K[0],$X, 5,$B,$C,$D,$E,$T,$A);
409	&BODY_00_15( 0,$K[0],$X, 6,$A,$B,$C,$D,$E,$T);
410	&BODY_00_15( 0,$K[0],$X, 7,$T,$A,$B,$C,$D,$E);
411	&BODY_00_15( 0,$K[0],$X, 8,$E,$T,$A,$B,$C,$D);
412	&BODY_00_15( 0,$K[0],$X, 9,$D,$E,$T,$A,$B,$C);
413	&BODY_00_15( 0,$K[0],$X,10,$C,$D,$E,$T,$A,$B);
414	&BODY_00_15( 0,$K[0],$X,11,$B,$C,$D,$E,$T,$A);
415	&BODY_00_15( 0,$K[0],$X,12,$A,$B,$C,$D,$E,$T);
416	&BODY_00_15( 0,$K[0],$X,13,$T,$A,$B,$C,$D,$E);
417	&BODY_00_15( 0,$K[0],$X,14,$E,$T,$A,$B,$C,$D);
418	&BODY_00_15( 1,$K[0],$X,15,$D,$E,$T,$A,$B,$C);
419	&BODY_16_19(-1,$K[0],$X,16,$C,$D,$E,$T,$A,$B);
420	&BODY_16_19( 0,$K[0],$X,17,$B,$C,$D,$E,$T,$A);
421	&BODY_16_19( 0,$K[0],$X,18,$A,$B,$C,$D,$E,$T);
422	&BODY_16_19( 1,$K[0],$X,19,$T,$A,$B,$C,$D,$E);
423
424	&BODY_20_39(-1,$K[1],$X,20,$E,$T,$A,$B,$C,$D);
425	&BODY_20_39( 0,$K[1],$X,21,$D,$E,$T,$A,$B,$C);
426	&BODY_20_39( 0,$K[1],$X,22,$C,$D,$E,$T,$A,$B);
427	&BODY_20_39( 0,$K[1],$X,23,$B,$C,$D,$E,$T,$A);
428	&BODY_20_39( 0,$K[1],$X,24,$A,$B,$C,$D,$E,$T);
429	&BODY_20_39( 0,$K[1],$X,25,$T,$A,$B,$C,$D,$E);
430	&BODY_20_39( 0,$K[1],$X,26,$E,$T,$A,$B,$C,$D);
431	&BODY_20_39( 0,$K[1],$X,27,$D,$E,$T,$A,$B,$C);
432	&BODY_20_39( 0,$K[1],$X,28,$C,$D,$E,$T,$A,$B);
433	&BODY_20_39( 0,$K[1],$X,29,$B,$C,$D,$E,$T,$A);
434	&BODY_20_39( 0,$K[1],$X,30,$A,$B,$C,$D,$E,$T);
435	&BODY_20_39( 0,$K[1],$X,31,$T,$A,$B,$C,$D,$E);
436	&BODY_20_39( 0,$K[1],$X,32,$E,$T,$A,$B,$C,$D);
437	&BODY_20_39( 0,$K[1],$X,33,$D,$E,$T,$A,$B,$C);
438	&BODY_20_39( 0,$K[1],$X,34,$C,$D,$E,$T,$A,$B);
439	&BODY_20_39( 0,$K[1],$X,35,$B,$C,$D,$E,$T,$A);
440	&BODY_20_39( 0,$K[1],$X,36,$A,$B,$C,$D,$E,$T);
441	&BODY_20_39( 0,$K[1],$X,37,$T,$A,$B,$C,$D,$E);
442	&BODY_20_39( 0,$K[1],$X,38,$E,$T,$A,$B,$C,$D);
443	&BODY_20_39( 1,$K[1],$X,39,$D,$E,$T,$A,$B,$C);
444
445	&BODY_40_59(-1,$K[2],$X,40,$C,$D,$E,$T,$A,$B);
446	&BODY_40_59( 0,$K[2],$X,41,$B,$C,$D,$E,$T,$A);
447	&BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T);
448	&BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E);
449	&BODY_40_59( 0,$K[2],$X,44,$E,$T,$A,$B,$C,$D);
450	&BODY_40_59( 0,$K[2],$X,45,$D,$E,$T,$A,$B,$C);
451	&BODY_40_59( 0,$K[2],$X,46,$C,$D,$E,$T,$A,$B);
452	&BODY_40_59( 0,$K[2],$X,47,$B,$C,$D,$E,$T,$A);
453	&BODY_40_59( 0,$K[2],$X,48,$A,$B,$C,$D,$E,$T);
454	&BODY_40_59( 0,$K[2],$X,49,$T,$A,$B,$C,$D,$E);
455	&BODY_40_59( 0,$K[2],$X,50,$E,$T,$A,$B,$C,$D);
456	&BODY_40_59( 0,$K[2],$X,51,$D,$E,$T,$A,$B,$C);
457	&BODY_40_59( 0,$K[2],$X,52,$C,$D,$E,$T,$A,$B);
458	&BODY_40_59( 0,$K[2],$X,53,$B,$C,$D,$E,$T,$A);
459	&BODY_40_59( 0,$K[2],$X,54,$A,$B,$C,$D,$E,$T);
460	&BODY_40_59( 0,$K[2],$X,55,$T,$A,$B,$C,$D,$E);
461	&BODY_40_59( 0,$K[2],$X,56,$E,$T,$A,$B,$C,$D);
462	&BODY_40_59( 0,$K[2],$X,57,$D,$E,$T,$A,$B,$C);
463	&BODY_40_59( 0,$K[2],$X,58,$C,$D,$E,$T,$A,$B);
464	&BODY_40_59( 1,$K[2],$X,59,$B,$C,$D,$E,$T,$A);
465
466	&BODY_60_79(-1,$K[3],$X,60,$A,$B,$C,$D,$E,$T);
467	&BODY_60_79( 0,$K[3],$X,61,$T,$A,$B,$C,$D,$E);
468	&BODY_60_79( 0,$K[3],$X,62,$E,$T,$A,$B,$C,$D);
469	&BODY_60_79( 0,$K[3],$X,63,$D,$E,$T,$A,$B,$C);
470	&BODY_60_79( 0,$K[3],$X,64,$C,$D,$E,$T,$A,$B);
471	&BODY_60_79( 0,$K[3],$X,65,$B,$C,$D,$E,$T,$A);
472	&BODY_60_79( 0,$K[3],$X,66,$A,$B,$C,$D,$E,$T);
473	&BODY_60_79( 0,$K[3],$X,67,$T,$A,$B,$C,$D,$E);
474	&BODY_60_79( 0,$K[3],$X,68,$E,$T,$A,$B,$C,$D);
475	&BODY_60_79( 0,$K[3],$X,69,$D,$E,$T,$A,$B,$C);
476	&BODY_60_79( 0,$K[3],$X,70,$C,$D,$E,$T,$A,$B);
477	&BODY_60_79( 0,$K[3],$X,71,$B,$C,$D,$E,$T,$A);
478	&BODY_60_79( 0,$K[3],$X,72,$A,$B,$C,$D,$E,$T);
479	&BODY_60_79( 0,$K[3],$X,73,$T,$A,$B,$C,$D,$E);
480	&BODY_60_79( 0,$K[3],$X,74,$E,$T,$A,$B,$C,$D);
481	&BODY_60_79( 0,$K[3],$X,75,$D,$E,$T,$A,$B,$C);
482	&BODY_60_79( 0,$K[3],$X,76,$C,$D,$E,$T,$A,$B);
483	&BODY_60_79( 0,$K[3],$X,77,$B,$C,$D,$E,$T,$A);
484	&BODY_60_79( 0,$K[3],$X,78,$A,$B,$C,$D,$E,$T);
485	&BODY_60_79( 2,$K[3],$X,79,$T,$A,$B,$C,$D,$E);
486
487	&comment("End processing");
488	&comment("");
489	# D is the tmp value
490
491	# E -> A
492	# T -> B
493	# A -> C
494	# B -> D
495	# C -> E
496	# D -> T
497
498	# The last 2 have been moved into the last loop
499	# &mov($tmp1,&wparam(0));
500
501	 &mov($D,	&DWP(12,$tmp1,"",0));
502	&add($D,$B);
503	 &mov($B,	&DWP( 4,$tmp1,"",0));
504	&add($B,$T);
505	 &mov($T,	$A);
506	&mov($A,	&DWP( 0,$tmp1,"",0));
507	 &mov(&DWP(12,$tmp1,"",0),$D);
508
509	&add($A,$E);
510	 &mov($E,	&DWP(16,$tmp1,"",0));
511	&add($E,$C);
512	 &mov($C,	&DWP( 8,$tmp1,"",0));
513	&add($C,$T);
514
515	 &mov(&DWP( 0,$tmp1,"",0),$A);
516	&mov("esi",&wparam(1));
517	 &mov(&DWP( 8,$tmp1,"",0),$C);
518 	&add("esi",64);
519	 &mov("eax",&swtmp(17));
520	&mov(&DWP(16,$tmp1,"",0),$E);
521	 &cmp("esi","eax");
522	&mov(&DWP( 4,$tmp1,"",0),$B);
523	 &jl(&label("start"));
524
525	&stack_pop(18+9);
526	 &pop("edi");
527	&pop("ebx");
528	 &pop("ebp");
529	&pop("esi");
530	 &ret();
531
532	# keep a note of shortcut label so it can be used outside
533	# block.
534	my $sclabel = &label("shortcut");
535
536	&function_end_B($name);
537	# Putting this here avoids problems with MASM in debugging mode
538	&sha1_block_host("sha1_block_asm_host_order", $sclabel);
539	}
540
541