1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#!/usr/local/bin/perl
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$L="edi";
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$R="esi";
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub DES_encrypt3
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	local($name,$enc)=@_;
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&function_begin_B($name,"");
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&push("ebx");
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov("ebx",&wparam(0));
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&push("ebp");
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&push("esi");
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&push("edi");
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("");
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("Load the data words");
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($L,&DWP(0,"ebx","",0));
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($R,&DWP(4,"ebx","",0));
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&stack_push(3);
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("");
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("IP");
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&IP_new($L,$R,"edx",0);
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	# put them back
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if ($enc)
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov(&DWP(4,"ebx","",0),$R);
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("eax",&wparam(1));
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov(&DWP(0,"ebx","",0),"edx");
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("edi",&wparam(2));
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("esi",&wparam(3));
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov(&DWP(4,"ebx","",0),$R);
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("esi",&wparam(1));
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov(&DWP(0,"ebx","",0),"edx");
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("edi",&wparam(2));
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("eax",&wparam(3));
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(2),	(DWC(($enc)?"1":"0")));
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(1),	"eax");
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(0),	"ebx");
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&call("DES_encrypt2");
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(2),	(DWC(($enc)?"0":"1")));
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(1),	"edi");
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(0),	"ebx");
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&call("DES_encrypt2");
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(2),	(DWC(($enc)?"1":"0")));
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(1),	"esi");
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&swtmp(0),	"ebx");
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&call("DES_encrypt2");
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&stack_pop(3);
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($L,&DWP(0,"ebx","",0));
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($R,&DWP(4,"ebx","",0));
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("");
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("FP");
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&FP_new($L,$R,"eax",0);
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&DWP(0,"ebx","",0),"eax");
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov(&DWP(4,"ebx","",0),$R);
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&pop("edi");
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&pop("esi");
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&pop("ebp");
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&pop("ebx");
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&ret();
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&function_end_B($name);
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
80