Add SSE2 support to VC++ build. Update MASM script.
authorDr. Stephen Henson <steve@openssl.org>
Thu, 19 Jul 2007 12:17:56 +0000 (12:17 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 19 Jul 2007 12:17:56 +0000 (12:17 +0000)
CHANGES
crypto/perlasm/x86ms.pl
crypto/rc4/rc4_skey.c
ms/do_masm.bat
ms/do_nasm.bat
util/mk1mf.pl
util/pl/VC-32.pl

diff --git a/CHANGES b/CHANGES
index 91611826230c961709773e9e7820c513d29583e5..59c47af1ebb766292fe2bdcf9ef7c263d9b09e6d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,11 @@
 
  Changes between 0.9.8e and 0.9.8f-fips  [xx XXX xxxx]
 
+  *) Add SSE2 instruction support to WIN32 build. These will be compiled
+     by default and used it an appopriate CPU is detected. Some older versions
+     of NASM or MASM which don't support SSE2 will need to be updated. 
+     [Steve Henson]
+
   *) Tolerate DigestInfo structure with absent parameters in FIPS mode
      (as required by several standards).
      [Steve Henson]
index 82538a9a9af8a5d421346a9a7dd65e0375215fe9..4badd1fc1c22ed87079ada4c59d06d62092f907b 100644 (file)
@@ -204,16 +204,17 @@ sub main'pand     { &out2("pand",@_); }
 sub out2
        {
        local($name,$p1,$p2)=@_;
-       local($l,$t);
+       local($l,$t,$line);
 
-       push(@out,"\t$name\t");
+       $line="\t$name\t";
        $t=&conv($p1).",";
        $l=length($t);
-       push(@out,$t);
+       $line.="$t";
        $l=4-($l+9)/8;
-       push(@out,"\t" x $l);
-       push(@out,&conv($p2));
-       push(@out,"\n");
+       $line.="\t" x $l;
+       $line.=&conv($p2);
+       if ($line=~/\bxmm[0-7]\b/i) { $line=~s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i; }
+       push(@out,$line."\n");
        }
 
 sub out0
@@ -338,12 +339,9 @@ EOF
 sub main'file_end
        {
        # try to detect if SSE2 or MMX extensions were used...
-       if (grep {/xmm[0-7]\s*,/i} @out) {
+       if (grep {/\b[x]?mm[0-7]\b,/i} @out) {
                grep {s/\.[3-7]86/\.686\n\t\.XMM/} @out;
                }
-       elsif (grep {/mm[0-7]\s*,/i} @out) {
-               grep {s/\.[3-7]86/\.686\n\t\.MMX/} @out;
-               }
        push(@out,"_TEXT\$      ENDS\n");
        push(@out,"END\n");
        }
index 22bf05317468e293df1c01b9fa365da7e14f0b57..4ab9981b227410e8a053965afc491d733950e66a 100644 (file)
@@ -128,7 +128,12 @@ FIPS_NON_FIPS_VCIPHER_Init(RC4)
                 * module...
                 *                              <appro@fy.chalmers.se>
                 */
+#ifdef OPENSSL_FIPS
+               unsigned long *ia32cap_ptr = OPENSSL_ia32cap_loc();
+               if (ia32cap_ptr && (*ia32cap_ptr & (1<<28))) {
+#else
                if (OPENSSL_ia32cap_P & (1<<28)) {
+#endif
                        unsigned char *cp=(unsigned char *)d;
 
                        for (i=0;i<256;i++) cp[i]=i;
index d522232ce7978e05172ed4101b88015282bc6e7c..6ea1c987169442fbd732ef5fec386aebc6bc9702 100755 (executable)
@@ -1,63 +1,72 @@
 @echo off
+
+SET ASMOPTS=-DOPENSSL_IA32_SSE2
 echo Generating x86 for MASM assember
 
 echo Bignum
 cd crypto\bn\asm
-perl x86.pl win32 > bn_win32.asm
+perl bn-586.pl win32 %ASMOPTS% > bn_win32.asm
+perl co-586.pl win32 %ASMOPTS% > co_win32.asm
 cd ..\..\..
 
 echo AES
 cd crypto\aes\asm
-perl aes-586.pl win32 > a_win32.asm
+perl aes-586.pl win32 %ASMOPTS% > a_win32.asm
 cd ..\..\..
 
 echo DES
 cd crypto\des\asm
-perl des-586.pl win32 > d_win32.asm
+perl des-586.pl win32 %ASMOPTS% > d_win32.asm
 cd ..\..\..
 
 echo "crypt(3)"
 
 cd crypto\des\asm
-perl crypt586.pl win32 > y_win32.asm
+perl crypt586.pl win32 %ASMOPTS% > y_win32.asm
 cd ..\..\..
 
 echo Blowfish
 
 cd crypto\bf\asm
-perl bf-586.pl win32 > b_win32.asm
+perl bf-586.pl win32 %ASMOPTS% > b_win32.asm
 cd ..\..\..
 
 echo CAST5
 cd crypto\cast\asm
-perl cast-586.pl win32 > c_win32.asm
+perl cast-586.pl win32 %ASMOPTS% > c_win32.asm
 cd ..\..\..
 
 echo RC4
 cd crypto\rc4\asm
-perl rc4-586.pl win32 > r4_win32.asm
+perl rc4-586.pl win32 %ASMOPTS% > r4_win32.asm
 cd ..\..\..
 
 echo MD5
 cd crypto\md5\asm
-perl md5-586.pl win32 > m5_win32.asm
+perl md5-586.pl win32 %ASMOPTS% > m5_win32.asm
 cd ..\..\..
 
 echo SHA1
 cd crypto\sha\asm
-perl sha1-586.pl win32 > s1_win32.asm
+perl sha1-586.pl win32 %ASMOPTS% > s1_win32.asm
+perl sha512-sse2.pl win32 %ASMOPTS% > sha512-sse2.asm
 cd ..\..\..
 
 echo RIPEMD160
 cd crypto\ripemd\asm
-perl rmd-586.pl win32 > rm_win32.asm
+perl rmd-586.pl win32 %ASMOPTS% > rm_win32.asm
 cd ..\..\..
 
 echo RC5\32
 cd crypto\rc5\asm
-perl rc5-586.pl win32 > r5_win32.asm
+perl rc5-586.pl win32 %ASMOPTS% > r5_win32.asm
 cd ..\..\..
 
+echo CPU-ID
+cd crypto
+perl x86cpuid.pl win32 %ASMOPTS% > cpu_win32.asm
+cd ..
+
 echo on
 
 perl util\mkfiles.pl >MINFO
index 9a27b1af66bcde59de9b75d988bad44321151364..7a2fa4566303b87e2a6816c2ba050e7fcfee276c 100755 (executable)
@@ -1,64 +1,73 @@
 
 @echo off
+
+SET ASMOPTS=-DOPENSSL_IA32_SSE2
 echo Generating x86 for NASM assember
 
 echo Bignum
 cd crypto\bn\asm
-perl x86.pl win32n > bn_win32.asm
+perl bn-586.pl win32n %ASMOPTS% > bn_win32.asm
+perl co-586.pl win32n %ASMOPTS% > co_win32.asm
 cd ..\..\..
 
 echo AES
 cd crypto\aes\asm
-perl aes-586.pl win32n > a_win32.asm
+perl aes-586.pl win32n %ASMOPTS% > a_win32.asm
 cd ..\..\..
 
 echo DES
 cd crypto\des\asm
-perl des-586.pl win32n > d_win32.asm
+perl des-586.pl win32n %ASMOPTS% > d_win32.asm
 cd ..\..\..
 
 echo "crypt(3)"
 
 cd crypto\des\asm
-perl crypt586.pl win32n > y_win32.asm
+perl crypt586.pl win32n %ASMOPTS% > y_win32.asm
 cd ..\..\..
 
 echo Blowfish
 
 cd crypto\bf\asm
-perl bf-586.pl win32n > b_win32.asm
+perl bf-586.pl win32n %ASMOPTS% > b_win32.asm
 cd ..\..\..
 
 echo CAST5
 cd crypto\cast\asm
-perl cast-586.pl win32n > c_win32.asm
+perl cast-586.pl win32n %ASMOPTS% > c_win32.asm
 cd ..\..\..
 
 echo RC4
 cd crypto\rc4\asm
-perl rc4-586.pl win32n > r4_win32.asm
+perl rc4-586.pl win32n %ASMOPTS% > r4_win32.asm
 cd ..\..\..
 
 echo MD5
 cd crypto\md5\asm
-perl md5-586.pl win32n > m5_win32.asm
+perl md5-586.pl win32n %ASMOPTS% > m5_win32.asm
 cd ..\..\..
 
 echo SHA1
 cd crypto\sha\asm
-perl sha1-586.pl win32n > s1_win32.asm
+perl sha1-586.pl win32n %ASMOPTS% > s1_win32.asm
+perl sha512-sse2.pl win32n %ASMOPTS% > sha512-sse2.asm
 cd ..\..\..
 
 echo RIPEMD160
 cd crypto\ripemd\asm
-perl rmd-586.pl win32n > rm_win32.asm
+perl rmd-586.pl win32n %ASMOPTS% > rm_win32.asm
 cd ..\..\..
 
 echo RC5\32
 cd crypto\rc5\asm
-perl rc5-586.pl win32n > r5_win32.asm
+perl rc5-586.pl win32n %ASMOPTS% > r5_win32.asm
 cd ..\..\..
 
+echo CPU-ID
+cd crypto
+perl x86cpuid.pl win32n %ASMOPTS% > cpu_win32.asm
+cd ..
+
 echo on
 
 perl util\mkfiles.pl >MINFO
index b2d7153c24c44668cff24bece34bba1292bb234d..3b46cb2dafc3531f0f1c5eab32ff2d63b193c91d 100755 (executable)
@@ -372,6 +372,7 @@ if ($fips)
                $fips_exclude_obj{$1} = 1 if (/\/([^\/]*)$/);
                }
 
+       $fips_exclude_obj{"cpu_win32"} = 1;
        $fips_exclude_obj{"bn_asm"} = 1;
        $fips_exclude_obj{"des_enc"} = 1;
        $fips_exclude_obj{"fcrypt_b"} = 1;
@@ -787,6 +788,11 @@ foreach (values %lib_nam)
 
        if ((!$fips && ($_ eq "CRYPTO")) || ($fips && ($_ eq "FIPS")))
                {
+               if ($cpuid_asm_obj ne "")
+                       {
+                       $lib_obj =~ s/\s(\S*\/cryptlib\S*)/ $1 \$(CPUID_ASM_OBJ)/;
+                       $rules.=&do_asm_rule($cpuid_asm_obj,$cpuid_asm_src);
+                       }
                if ($aes_asm_obj ne "")
                        {
                        $lib_obj =~ s/\s(\S*\/aes_core\S*)/ \$(AES_ASM_OBJ)/;
@@ -845,11 +851,6 @@ foreach (values %lib_nam)
                $lib_obj =~ s/\s(\S*\/rmd_dgst\S*)/ $1 \$(RMD160_ASM_OBJ)/;
                $rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src);
                }
-       if (($cpuid_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s(\S*\/cversion\S*)/ $1 \$(CPUID_ASM_OBJ)/;
-               $rules.=&do_asm_rule($cpuid_asm_obj,$cpuid_asm_src);
-               }
        $defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
        $lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)";
        $rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);
index 6f64f3abf4a21d8af3d43d84adedbb25bf1239d1..7682a591ce4cdc2bd77fa3a82885297f591adf46 100644 (file)
@@ -194,6 +194,8 @@ if (!$no_asm)
        $aes_asm_src='crypto\aes\asm\a_win32.asm';
        $bn_asm_obj='crypto\bn\asm\bn_win32.obj';
        $bn_asm_src='crypto\bn\asm\bn_win32.asm';
+       $bnco_asm_obj='crypto\bn\asm\co_win32.obj';
+       $bnco_asm_src='crypto\bn\asm\co_win32.asm';
        $des_enc_obj='crypto\des\asm\d_win32.obj crypto\des\asm\y_win32.obj';
        $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm';
        $bf_enc_obj='crypto\bf\asm\b_win32.obj';
@@ -206,11 +208,13 @@ if (!$no_asm)
        $rc5_enc_src='crypto\rc5\asm\r5_win32.asm';
        $md5_asm_obj='crypto\md5\asm\m5_win32.obj';
        $md5_asm_src='crypto\md5\asm\m5_win32.asm';
-       $sha1_asm_obj='crypto\sha\asm\s1_win32.obj';
-       $sha1_asm_src='crypto\sha\asm\s1_win32.asm';
+       $sha1_asm_obj='crypto\sha\asm\s1_win32.obj crypto\sha\asm\sha512-sse2.obj';
+       $sha1_asm_src='crypto\sha\asm\s1_win32.asm crypto\sha\asm\sha512-sse2.asm';
        $rmd160_asm_obj='crypto\ripemd\asm\rm_win32.obj';
        $rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm';
-       $cflags.=" -DAES_ASM -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM";
+       $cpuid_asm_obj='crypto\cpu_win32.obj';
+       $cpuid_asm_src='crypto\cpu_win32.asm';
+       $cflags.=" -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DAES_ASM -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DMD5_ASM -DSHA1_ASM -DRMD160_ASM";
        }
 
 if ($shlib && $FLAVOR !~ /CE/)