From: Igor Ustinov Date: Tue, 14 Oct 2025 18:30:49 +0000 (+0200) Subject: Correct assembler version checking in perlasm scripts X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=342e2b79f247e2253d271a036d3c39bb67bc5270;p=thirdparty%2Fopenssl.git Correct assembler version checking in perlasm scripts Fixes #20520 Reviewed-by: Richard Levitte Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/28901) (cherry picked from commit 9820582da330151a1238a33e5c6e23ed31324164) --- diff --git a/crypto/bn/asm/rsaz-2k-avx512.pl b/crypto/bn/asm/rsaz-2k-avx512.pl index 7ee02778df5..4dab65a301d 100644 --- a/crypto/bn/asm/rsaz-2k-avx512.pl +++ b/crypto/bn/asm/rsaz-2k-avx512.pl @@ -40,13 +40,15 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; die "can't locate x86_64-xlate.pl"; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $avx512ifma = ($1>=2.26); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx512ifma = ($ver >= 2.26); } if (!$avx512ifma && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) { - $avx512ifma = ($1==2.11 && $2>=8) + ($1>=2.12); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?/) { + my $ver = $1 + $2/100.0 + $3/10000.0; # 3.1.0->3.01, 3.10.1->3.1001 + $avx512ifma = ($ver >= 2.1108); } if (!$avx512ifma && `$ENV{CC} -v 2>&1` diff --git a/crypto/bn/asm/rsaz-3k-avx512.pl b/crypto/bn/asm/rsaz-3k-avx512.pl index 8ed5496479b..3a686049b29 100644 --- a/crypto/bn/asm/rsaz-3k-avx512.pl +++ b/crypto/bn/asm/rsaz-3k-avx512.pl @@ -39,13 +39,15 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; die "can't locate x86_64-xlate.pl"; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $avx512ifma = ($1>=2.26); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx512ifma = ($ver >= 2.26); } if (!$avx512ifma && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) { - $avx512ifma = ($1==2.11 && $2>=8) + ($1>=2.12); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?/) { + my $ver = $1 + $2/100.0 + $3/10000.0; # 3.1.0->3.01, 3.10.1->3.1001 + $avx512ifma = ($ver >= 2.1108); } if (!$avx512ifma && `$ENV{CC} -v 2>&1` diff --git a/crypto/bn/asm/rsaz-4k-avx512.pl b/crypto/bn/asm/rsaz-4k-avx512.pl index 8c59b77f778..5a0dc84ba4b 100644 --- a/crypto/bn/asm/rsaz-4k-avx512.pl +++ b/crypto/bn/asm/rsaz-4k-avx512.pl @@ -39,13 +39,15 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; die "can't locate x86_64-xlate.pl"; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $avx512ifma = ($1>=2.26); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx512ifma = ($ver >= 2.26); } if (!$avx512ifma && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) { - $avx512ifma = ($1==2.11 && $2>=8) + ($1>=2.12); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?/) { + my $ver = $1 + $2/100.0 + $3/10000.0; # 3.1.0->3.01, 3.10.1->3.1001 + $avx512ifma = ($ver >= 2.1108); } if (!$avx512ifma && `$ENV{CC} -v 2>&1` diff --git a/crypto/bn/asm/rsaz-x86_64.pl b/crypto/bn/asm/rsaz-x86_64.pl index 5c7d526fa37..f673d4ba420 100755 --- a/crypto/bn/asm/rsaz-x86_64.pl +++ b/crypto/bn/asm/rsaz-x86_64.pl @@ -69,13 +69,15 @@ open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"" *STDOUT=*OUT; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $addx = ($1>=2.23); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $addx = ($ver >= 2.23); } if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/) { - $addx = ($1>=2.10); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $addx = ($ver >= 2.10); } if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) && diff --git a/crypto/bn/asm/x86_64-mont5.pl b/crypto/bn/asm/x86_64-mont5.pl index 1faea0bcf89..eef5a99c407 100755 --- a/crypto/bn/asm/x86_64-mont5.pl +++ b/crypto/bn/asm/x86_64-mont5.pl @@ -48,13 +48,15 @@ open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"" *STDOUT=*OUT; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $addx = ($1>=2.23); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $addx = ($ver >= 2.23); } if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/) { - $addx = ($1>=2.10); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $addx = ($ver >= 2.10); } if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) && diff --git a/crypto/chacha/asm/chacha-x86.pl b/crypto/chacha/asm/chacha-x86.pl index d0e83d88cec..a1ea4ea461b 100755 --- a/crypto/chacha/asm/chacha-x86.pl +++ b/crypto/chacha/asm/chacha-x86.pl @@ -49,12 +49,12 @@ for (@ARGV) { $xmm=1 if (/-DOPENSSL_IA32_SSE2/); } $ymm=1 if ($xmm && `$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/ && - ($gasver=$1)>=2.19); # first version supporting AVX + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/ && + ($gasver = $1 + $2/100.0) >= 2.19); # first version supporting AVX $ymm=1 if ($xmm && !$ymm && $ARGV[0] eq "win32n" && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/ && - $1>=2.03); # first version supporting AVX + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)/ && + $1 + $2/100.0 >= 2.03); # first version supporting AVX $ymm=1 if ($xmm && !$ymm && $ARGV[0] eq "win32" && `ml 2>&1` =~ /Version ([0-9]+)\./ && diff --git a/crypto/chacha/asm/chacha-x86_64.pl b/crypto/chacha/asm/chacha-x86_64.pl index cdb900c037f..c8dd8809661 100755 --- a/crypto/chacha/asm/chacha-x86_64.pl +++ b/crypto/chacha/asm/chacha-x86_64.pl @@ -71,14 +71,15 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; die "can't locate x86_64-xlate.pl"; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $avx = ($1>=2.19) + ($1>=2.22) + ($1>=2.25); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx = ($ver >= 2.19) + ($ver >= 2.22) + ($ver >= 2.25); } if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) { - $avx = ($1>=2.09) + ($1>=2.10) + ($1>=2.12); - $avx += 1 if ($1==2.11 && $2>=8); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?/) { + my $ver = $1 + $2/100.0 + $3/10000.0; # 3.1.0->3.01, 3.10.1->3.1001 + $avx = ($ver >= 2.09) + ($ver >= 2.10) + ($ver >= 2.1108); } if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) && diff --git a/crypto/modes/asm/aesni-gcm-x86_64.pl b/crypto/modes/asm/aesni-gcm-x86_64.pl index eaf4d9c755f..c54992a40ca 100644 --- a/crypto/modes/asm/aesni-gcm-x86_64.pl +++ b/crypto/modes/asm/aesni-gcm-x86_64.pl @@ -53,13 +53,15 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; die "can't locate x86_64-xlate.pl"; if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/) { - $avx = ($1>=2.20) + ($1>=2.22); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx = ($ver >= 2.20) + ($ver >= 2.22); } if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/) { - $avx = ($1>=2.09) + ($1>=2.10); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx = ($ver >= 2.09) + ($ver >= 2.10); } if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&