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=9820582da330151a1238a33e5c6e23ed31324164;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) --- diff --git a/crypto/aes/asm/aesni-xts-avx512.pl b/crypto/aes/asm/aesni-xts-avx512.pl index 2e20a6e6b85..d89564112e3 100644 --- a/crypto/aes/asm/aesni-xts-avx512.pl +++ b/crypto/aes/asm/aesni-xts-avx512.pl @@ -35,13 +35,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]+)/) { - $avx512vaes = ($1>=2.30); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avx512vaes = ($ver >= 2.30); } if (!$avx512vaes && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) { - $avx512vaes = ($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 + $avx512vaes = ($ver >= 2.1108); } if (!$avx512vaes && `$ENV{CC} -v 2>&1` diff --git a/crypto/bn/asm/rsaz-2k-avx512.pl b/crypto/bn/asm/rsaz-2k-avx512.pl index 131e315324c..27f2e9b4b93 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-2k-avxifma.pl b/crypto/bn/asm/rsaz-2k-avxifma.pl index 0c962f248dd..ea45d2051a7 100644 --- a/crypto/bn/asm/rsaz-2k-avxifma.pl +++ b/crypto/bn/asm/rsaz-2k-avxifma.pl @@ -28,8 +28,9 @@ $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]+)/) { - $avxifma = ($1>=2.40); + =~ /GNU assembler version ([0-9]+)\.([0-9]+)/) { + my $ver = $1 + $2/100.0; # 3.1->3.01, 3.10->3.10 + $avxifma = ($ver >= 2.40); } if (!$avxifma && `$ENV{CC} -v 2>&1` @@ -39,8 +40,9 @@ if (!$avxifma && `$ENV{CC} -v 2>&1` } if ($win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?(rc[0-9]+)?/) { - $avxifma = ($1>2.16) + ($1==2.16 && ((!defined($2) && !defined($3)) || (defined($2)))); + `nasm -v 2>&1` =~ /NASM version ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(rc[0-9]+)?/) { + my $ver = $1 + $2/100.0 + $3/10000.0; # 3.1.0->3.01, 3.10.1->3.1001 + $avxifma = ($ver > 2.16) + ($ver == 2.16 && !defined($4)); } open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"" diff --git a/crypto/bn/asm/rsaz-3k-avx512.pl b/crypto/bn/asm/rsaz-3k-avx512.pl index 235268a68ad..b2ed3e8ca7c 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 e39374362b6..b76ab5904c8 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 f255925a813..ebb4762b635 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 be2c7b4da45..6b40f789b39 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 b53ceac1dc5..9cda820ff07 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 bd287fa66cb..9e5e1ba1e17 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 8cc98e41f84..a2b3d853640 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/) &&