IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep
[openssl.git] / crypto / des / asm / crypt586.pl
index 3d41d82f69d35f1146351d1f77d3b5881cd9b451..51fb3ddf26e4a00d34d97484209c95e30db506fe 100644 (file)
@@ -26,11 +26,17 @@ sub fcrypt_body
 
        &comment("");
        &comment("Load the 2 words");
-       $ks="ebp";
+       $trans="ebp";
 
        &xor(   $L,     $L);
        &xor(   $R,     $R);
-       &mov($ks,&wparam(1));
+
+       # PIC-ification:-)
+       if ($cpp)       { &picmeup("edx","DES_SPtrans");   }
+       else            { &lea("edx",&DWP("DES_SPtrans")); }
+       &push("edx");   # becomes &swtmp(1)
+       #
+       &mov($trans,&wparam(1)); # reloaded with DES_SPtrans in D_ENCRYPT
 
        &push(&DWC(25)); # add a variable
 
@@ -39,11 +45,11 @@ sub fcrypt_body
                {
                &comment("");
                &comment("Round $i");
-               &D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
 
                &comment("");
                &comment("Round ".sprintf("%d",$i+1));
-               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
                }
         &mov("ebx",    &swtmp(0));
        &mov("eax",     $L);
@@ -61,14 +67,14 @@ sub fcrypt_body
        &mov(&DWP(0,"edx","",0),"eax");
        &mov(&DWP(4,"edx","",0),$L);
 
-       &pop("ecx");    # remove variable
+       &add("esp",8);  # remove variables
 
        &function_end($name);
        }
 
 sub D_ENCRYPT
        {
-       local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
+       local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;
 
        &mov(   $u,             &wparam(2));                    # 2
        &mov(   $t,             $R);
@@ -85,9 +91,9 @@ sub D_ENCRYPT
        &shl(   $tmp2,          16);                            # 1
        &xor(   $u,             $tmp1);                         # 2
        &xor(   $t,             $tmp2);                         # 2
-       &mov(   $tmp1,          &DWP(&n2a($S*4),$ks,"",0));     # 2
+       &mov(   $tmp1,          &DWP(&n2a($S*4),$trans,"",0));  # 2
        &xor(   $u,             $tmp1);
-       &mov(   $tmp2,          &DWP(&n2a(($S+1)*4),$ks,"",0)); # 2
+       &mov(   $tmp2,          &DWP(&n2a(($S+1)*4),$trans,"",0));      # 2
        &xor(   $u,             $R);
        &xor(   $t,             $R);
        &xor(   $t,             $tmp2);
@@ -99,31 +105,28 @@ sub D_ENCRYPT
        &movb(  &LB($tmp1),     &LB($u) );
        &movb(  &LB($tmp2),     &HB($u) );
        &rotr(  $t,             4               );
-       &mov(   $ks,            &DWP("      $desSP",$tmp1,"",0));
+       &mov(   $trans,         &swtmp(1));
+       &xor(   $L,             &DWP("     ",$trans,$tmp1,0));
        &movb(  &LB($tmp1),     &LB($t) );
-       &xor(   $L,             $ks);
-       &mov(   $ks,            &DWP("0x200+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks);
+       &xor(   $L,             &DWP("0x200",$trans,$tmp2,0));
        &movb(  &LB($tmp2),     &HB($t) );
        &shr(   $u,             16);
-       &mov(   $ks,            &DWP("0x100+$desSP",$tmp1,"",0));
-       &xor(   $L,             $ks); 
+       &xor(   $L,             &DWP("0x100",$trans,$tmp1,0));
        &movb(  &LB($tmp1),     &HB($u) );
        &shr(   $t,             16);
-       &mov(   $ks,            &DWP("0x300+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks);
-       &mov(   $ks,            &wparam(1));
+       &xor(   $L,             &DWP("0x300",$trans,$tmp2,0));
        &movb(  &LB($tmp2),     &HB($t) );
        &and(   $u,             "0xff"  );
        &and(   $t,             "0xff"  );
-       &mov(   $tmp1,          &DWP("0x600+$desSP",$tmp1,"",0));
+       &mov(   $tmp1,          &DWP("0x600",$trans,$tmp1,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x700+$desSP",$tmp2,"",0));
+       &mov(   $tmp1,          &DWP("0x700",$trans,$tmp2,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x400+$desSP",$u,"",0));
+       &mov(   $tmp1,          &DWP("0x400",$trans,$u,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x500+$desSP",$t,"",0));
+       &mov(   $tmp1,          &DWP("0x500",$trans,$t,0));
        &xor(   $L,             $tmp1);
+       &mov(   $trans,         &wparam(1));
        }
 
 sub n2a