155714Skris#!/usr/local/bin/perl
255714Skris
355714Skris$L="edi";
455714Skris$R="esi";
555714Skris
6109998Smarkmsub DES_encrypt3
755714Skris	{
855714Skris	local($name,$enc)=@_;
955714Skris
1055714Skris	&function_begin_B($name,"");
1155714Skris	&push("ebx");
1255714Skris	&mov("ebx",&wparam(0));
1355714Skris
1455714Skris	&push("ebp");
1555714Skris	&push("esi");
1655714Skris
1755714Skris	&push("edi");
1855714Skris
1955714Skris	&comment("");
2055714Skris	&comment("Load the data words");
2155714Skris	&mov($L,&DWP(0,"ebx","",0));
2255714Skris	&mov($R,&DWP(4,"ebx","",0));
2355714Skris	&stack_push(3);
2455714Skris
2555714Skris	&comment("");
2655714Skris	&comment("IP");
2755714Skris	&IP_new($L,$R,"edx",0);
2855714Skris
2955714Skris	# put them back
3055714Skris
3155714Skris	if ($enc)
3255714Skris		{
3355714Skris		&mov(&DWP(4,"ebx","",0),$R);
3455714Skris		 &mov("eax",&wparam(1));
3555714Skris		&mov(&DWP(0,"ebx","",0),"edx");
3655714Skris		 &mov("edi",&wparam(2));
3755714Skris		 &mov("esi",&wparam(3));
3855714Skris		}
3955714Skris	else
4055714Skris		{
4155714Skris		&mov(&DWP(4,"ebx","",0),$R);
4255714Skris		 &mov("esi",&wparam(1));
4355714Skris		&mov(&DWP(0,"ebx","",0),"edx");
4455714Skris		 &mov("edi",&wparam(2));
4555714Skris		 &mov("eax",&wparam(3));
4655714Skris		}
4755714Skris	&mov(&swtmp(2),	(DWC(($enc)?"1":"0")));
4855714Skris	&mov(&swtmp(1),	"eax");
4955714Skris	&mov(&swtmp(0),	"ebx");
50109998Smarkm	&call("DES_encrypt2");
5155714Skris	&mov(&swtmp(2),	(DWC(($enc)?"0":"1")));
5255714Skris	&mov(&swtmp(1),	"edi");
5355714Skris	&mov(&swtmp(0),	"ebx");
54109998Smarkm	&call("DES_encrypt2");
5555714Skris	&mov(&swtmp(2),	(DWC(($enc)?"1":"0")));
5655714Skris	&mov(&swtmp(1),	"esi");
5755714Skris	&mov(&swtmp(0),	"ebx");
58109998Smarkm	&call("DES_encrypt2");
5955714Skris
6055714Skris	&stack_pop(3);
6155714Skris	&mov($L,&DWP(0,"ebx","",0));
6255714Skris	&mov($R,&DWP(4,"ebx","",0));
6355714Skris
6455714Skris	&comment("");
6555714Skris	&comment("FP");
6655714Skris	&FP_new($L,$R,"eax",0);
6755714Skris
6855714Skris	&mov(&DWP(0,"ebx","",0),"eax");
6955714Skris	&mov(&DWP(4,"ebx","",0),$R);
7055714Skris
7155714Skris	&pop("edi");
7255714Skris	&pop("esi");
7355714Skris	&pop("ebp");
7455714Skris	&pop("ebx");
7555714Skris	&ret();
7655714Skris	&function_end_B($name);
7755714Skris	}
7855714Skris
7955714Skris
80