rtcd: fix unstable application of --require- Previously, --require-X arguments to rtcd.pl would be applied in hash order, which isn't stable from run to run. Consequently, something like --require-ssse3 --require-sse4_1 could sometimes #define functions to SSSE3 and other times to SSE4.1 randomly. Instead, force a stable order by sorting before calling require(). Secondarily, x86_64 and ARM64 would override the command line options with SSE2 and NEON respectively, leading to a mildly broken RTCD with --require-X arguments present. Instead, don't provide default architecture requirements if --require-X are on the command line. Change-Id: I428deefaf1961b5d5e8465ed1e259875aef03ec0
diff --git a/build/cmake/rtcd.pl b/build/cmake/rtcd.pl index 6cd6a5c..5d0592b 100755 --- a/build/cmake/rtcd.pl +++ b/build/cmake/rtcd.pl
@@ -420,27 +420,45 @@ common_bottom; } +# List of architectures in low-to-high preference order. +my @PRIORITY_ARCH = qw/ + c + mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 avx avx2 + arm_crc32 neon neon_dotprod neon_i8mm sve sve2 + rvv + vsx + dspr2 msa +/; +my %PRIORITY_INDEX; +for (my $i = 0; $i < @PRIORITY_ARCH; $i++) { + $PRIORITY_INDEX{$PRIORITY_ARCH[$i]} = $i; +} + # # Main Driver # &require("c"); -&require(keys %required); +&require(sort { $PRIORITY_INDEX{$a} <=> $PRIORITY_INDEX{$b} } keys %required); if ($opts{arch} eq 'x86') { @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 avx avx2/); x86; } elsif ($opts{arch} eq 'x86_64') { @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 avx avx2/); - @REQUIRES = filter(qw/mmx sse sse2/); - &require(@REQUIRES); + if (keys %required == 0) { + @REQUIRES = filter(qw/mmx sse sse2/); + &require(@REQUIRES); + } x86; } elsif ($opts{arch} =~ /armv[78]\w?/) { @ALL_ARCHS = filter(qw/neon/); arm; } elsif ($opts{arch} eq 'arm64' ) { @ALL_ARCHS = filter(qw/neon arm_crc32 neon_dotprod neon_i8mm sve sve2/); - @REQUIRES = filter(qw/neon/); - &require(@REQUIRES); + if (keys %required == 0) { + @REQUIRES = filter(qw/neon/); + &require(@REQUIRES); + } arm; } elsif ($opts{arch} eq 'ppc') { @ALL_ARCHS = filter(qw/vsx/);