Add SSE2 support to VC++ build. Update MASM script.

This commit is contained in:
Dr. Stephen Henson 2007-07-19 12:17:56 +00:00
parent bfdfc67b01
commit 23830280e4
7 changed files with 71 additions and 40 deletions

View File

@ -4,6 +4,11 @@
Changes between 0.9.8e and 0.9.8f-fips [xx XXX xxxx] 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 *) Tolerate DigestInfo structure with absent parameters in FIPS mode
(as required by several standards). (as required by several standards).
[Steve Henson] [Steve Henson]

View File

@ -204,16 +204,17 @@ sub main'pand { &out2("pand",@_); }
sub out2 sub out2
{ {
local($name,$p1,$p2)=@_; local($name,$p1,$p2)=@_;
local($l,$t); local($l,$t,$line);
push(@out,"\t$name\t"); $line="\t$name\t";
$t=&conv($p1).","; $t=&conv($p1).",";
$l=length($t); $l=length($t);
push(@out,$t); $line.="$t";
$l=4-($l+9)/8; $l=4-($l+9)/8;
push(@out,"\t" x $l); $line.="\t" x $l;
push(@out,&conv($p2)); $line.=&conv($p2);
push(@out,"\n"); if ($line=~/\bxmm[0-7]\b/i) { $line=~s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i; }
push(@out,$line."\n");
} }
sub out0 sub out0
@ -338,12 +339,9 @@ EOF
sub main'file_end sub main'file_end
{ {
# try to detect if SSE2 or MMX extensions were used... # 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; 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,"_TEXT\$ ENDS\n");
push(@out,"END\n"); push(@out,"END\n");
} }

View File

@ -128,7 +128,12 @@ FIPS_NON_FIPS_VCIPHER_Init(RC4)
* module... * module...
* <appro@fy.chalmers.se> * <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)) { if (OPENSSL_ia32cap_P & (1<<28)) {
#endif
unsigned char *cp=(unsigned char *)d; unsigned char *cp=(unsigned char *)d;
for (i=0;i<256;i++) cp[i]=i; for (i=0;i<256;i++) cp[i]=i;

View File

@ -1,63 +1,72 @@
@echo off @echo off
SET ASMOPTS=-DOPENSSL_IA32_SSE2
echo Generating x86 for MASM assember echo Generating x86 for MASM assember
echo Bignum echo Bignum
cd crypto\bn\asm 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 ..\..\.. cd ..\..\..
echo AES echo AES
cd crypto\aes\asm cd crypto\aes\asm
perl aes-586.pl win32 > a_win32.asm perl aes-586.pl win32 %ASMOPTS% > a_win32.asm
cd ..\..\.. cd ..\..\..
echo DES echo DES
cd crypto\des\asm cd crypto\des\asm
perl des-586.pl win32 > d_win32.asm perl des-586.pl win32 %ASMOPTS% > d_win32.asm
cd ..\..\.. cd ..\..\..
echo "crypt(3)" echo "crypt(3)"
cd crypto\des\asm cd crypto\des\asm
perl crypt586.pl win32 > y_win32.asm perl crypt586.pl win32 %ASMOPTS% > y_win32.asm
cd ..\..\.. cd ..\..\..
echo Blowfish echo Blowfish
cd crypto\bf\asm cd crypto\bf\asm
perl bf-586.pl win32 > b_win32.asm perl bf-586.pl win32 %ASMOPTS% > b_win32.asm
cd ..\..\.. cd ..\..\..
echo CAST5 echo CAST5
cd crypto\cast\asm cd crypto\cast\asm
perl cast-586.pl win32 > c_win32.asm perl cast-586.pl win32 %ASMOPTS% > c_win32.asm
cd ..\..\.. cd ..\..\..
echo RC4 echo RC4
cd crypto\rc4\asm cd crypto\rc4\asm
perl rc4-586.pl win32 > r4_win32.asm perl rc4-586.pl win32 %ASMOPTS% > r4_win32.asm
cd ..\..\.. cd ..\..\..
echo MD5 echo MD5
cd crypto\md5\asm cd crypto\md5\asm
perl md5-586.pl win32 > m5_win32.asm perl md5-586.pl win32 %ASMOPTS% > m5_win32.asm
cd ..\..\.. cd ..\..\..
echo SHA1 echo SHA1
cd crypto\sha\asm 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 ..\..\.. cd ..\..\..
echo RIPEMD160 echo RIPEMD160
cd crypto\ripemd\asm cd crypto\ripemd\asm
perl rmd-586.pl win32 > rm_win32.asm perl rmd-586.pl win32 %ASMOPTS% > rm_win32.asm
cd ..\..\.. cd ..\..\..
echo RC5\32 echo RC5\32
cd crypto\rc5\asm cd crypto\rc5\asm
perl rc5-586.pl win32 > r5_win32.asm perl rc5-586.pl win32 %ASMOPTS% > r5_win32.asm
cd ..\..\.. cd ..\..\..
echo CPU-ID
cd crypto
perl x86cpuid.pl win32 %ASMOPTS% > cpu_win32.asm
cd ..
echo on echo on
perl util\mkfiles.pl >MINFO perl util\mkfiles.pl >MINFO

View File

@ -1,64 +1,73 @@
@echo off @echo off
SET ASMOPTS=-DOPENSSL_IA32_SSE2
echo Generating x86 for NASM assember echo Generating x86 for NASM assember
echo Bignum echo Bignum
cd crypto\bn\asm 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 ..\..\.. cd ..\..\..
echo AES echo AES
cd crypto\aes\asm cd crypto\aes\asm
perl aes-586.pl win32n > a_win32.asm perl aes-586.pl win32n %ASMOPTS% > a_win32.asm
cd ..\..\.. cd ..\..\..
echo DES echo DES
cd crypto\des\asm cd crypto\des\asm
perl des-586.pl win32n > d_win32.asm perl des-586.pl win32n %ASMOPTS% > d_win32.asm
cd ..\..\.. cd ..\..\..
echo "crypt(3)" echo "crypt(3)"
cd crypto\des\asm cd crypto\des\asm
perl crypt586.pl win32n > y_win32.asm perl crypt586.pl win32n %ASMOPTS% > y_win32.asm
cd ..\..\.. cd ..\..\..
echo Blowfish echo Blowfish
cd crypto\bf\asm cd crypto\bf\asm
perl bf-586.pl win32n > b_win32.asm perl bf-586.pl win32n %ASMOPTS% > b_win32.asm
cd ..\..\.. cd ..\..\..
echo CAST5 echo CAST5
cd crypto\cast\asm cd crypto\cast\asm
perl cast-586.pl win32n > c_win32.asm perl cast-586.pl win32n %ASMOPTS% > c_win32.asm
cd ..\..\.. cd ..\..\..
echo RC4 echo RC4
cd crypto\rc4\asm cd crypto\rc4\asm
perl rc4-586.pl win32n > r4_win32.asm perl rc4-586.pl win32n %ASMOPTS% > r4_win32.asm
cd ..\..\.. cd ..\..\..
echo MD5 echo MD5
cd crypto\md5\asm cd crypto\md5\asm
perl md5-586.pl win32n > m5_win32.asm perl md5-586.pl win32n %ASMOPTS% > m5_win32.asm
cd ..\..\.. cd ..\..\..
echo SHA1 echo SHA1
cd crypto\sha\asm 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 ..\..\.. cd ..\..\..
echo RIPEMD160 echo RIPEMD160
cd crypto\ripemd\asm cd crypto\ripemd\asm
perl rmd-586.pl win32n > rm_win32.asm perl rmd-586.pl win32n %ASMOPTS% > rm_win32.asm
cd ..\..\.. cd ..\..\..
echo RC5\32 echo RC5\32
cd crypto\rc5\asm cd crypto\rc5\asm
perl rc5-586.pl win32n > r5_win32.asm perl rc5-586.pl win32n %ASMOPTS% > r5_win32.asm
cd ..\..\.. cd ..\..\..
echo CPU-ID
cd crypto
perl x86cpuid.pl win32n %ASMOPTS% > cpu_win32.asm
cd ..
echo on echo on
perl util\mkfiles.pl >MINFO perl util\mkfiles.pl >MINFO

View File

@ -372,6 +372,7 @@ if ($fips)
$fips_exclude_obj{$1} = 1 if (/\/([^\/]*)$/); $fips_exclude_obj{$1} = 1 if (/\/([^\/]*)$/);
} }
$fips_exclude_obj{"cpu_win32"} = 1;
$fips_exclude_obj{"bn_asm"} = 1; $fips_exclude_obj{"bn_asm"} = 1;
$fips_exclude_obj{"des_enc"} = 1; $fips_exclude_obj{"des_enc"} = 1;
$fips_exclude_obj{"fcrypt_b"} = 1; $fips_exclude_obj{"fcrypt_b"} = 1;
@ -787,6 +788,11 @@ foreach (values %lib_nam)
if ((!$fips && ($_ eq "CRYPTO")) || ($fips && ($_ eq "FIPS"))) 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 "") if ($aes_asm_obj ne "")
{ {
$lib_obj =~ s/\s(\S*\/aes_core\S*)/ \$(AES_ASM_OBJ)/; $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)/; $lib_obj =~ s/\s(\S*\/rmd_dgst\S*)/ $1 \$(RMD160_ASM_OBJ)/;
$rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src); $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); $defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
$lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)"; $lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)";
$rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib); $rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);

View File

@ -194,6 +194,8 @@ if (!$no_asm)
$aes_asm_src='crypto\aes\asm\a_win32.asm'; $aes_asm_src='crypto\aes\asm\a_win32.asm';
$bn_asm_obj='crypto\bn\asm\bn_win32.obj'; $bn_asm_obj='crypto\bn\asm\bn_win32.obj';
$bn_asm_src='crypto\bn\asm\bn_win32.asm'; $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_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'; $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm';
$bf_enc_obj='crypto\bf\asm\b_win32.obj'; $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'; $rc5_enc_src='crypto\rc5\asm\r5_win32.asm';
$md5_asm_obj='crypto\md5\asm\m5_win32.obj'; $md5_asm_obj='crypto\md5\asm\m5_win32.obj';
$md5_asm_src='crypto\md5\asm\m5_win32.asm'; $md5_asm_src='crypto\md5\asm\m5_win32.asm';
$sha1_asm_obj='crypto\sha\asm\s1_win32.obj'; $sha1_asm_obj='crypto\sha\asm\s1_win32.obj crypto\sha\asm\sha512-sse2.obj';
$sha1_asm_src='crypto\sha\asm\s1_win32.asm'; $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_obj='crypto\ripemd\asm\rm_win32.obj';
$rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm'; $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/) if ($shlib && $FLAVOR !~ /CE/)