From: Gra??vydas Ignotas Date: Fri, 9 Feb 2024 17:02:23 +0000 (+0200) Subject: x86 regtest: fix clobber lists in generated asm statements X-Git-Tag: VALGRIND_3_23_0~172 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b3d0828451f8e69e0eaf3807ffbe502aecda428;p=thirdparty%2Fvalgrind.git x86 regtest: fix clobber lists in generated asm statements Must add result registers also, or else code like this is generated: asm( "fsave %3\n" "movl %2, %%eax\n" "cdq\n" "movl %%edx, %0\n" "movl %%eax, %1\n" "frstor %3\n" "cld\n" : "=m" (result0), "=m" (result1) : "m" (preset0), "m" (state[0]) : "eax" ); This crashes on my machine because gcc places some pointer in %%edx. --- diff --git a/none/tests/amd64/gen_insn_test.pl b/none/tests/amd64/gen_insn_test.pl index a144ec4ea8..aa3910462d 100644 --- a/none/tests/amd64/gen_insn_test.pl +++ b/none/tests/amd64/gen_insn_test.pl @@ -893,16 +893,20 @@ while (<>) print qq|$prefix\"m\" \(state[0]\)\n|; $prefix = " : "; + my %clobber_added; - foreach my $arg (@presets, @args) + foreach my $arg (@presets, @results, @args) { if ($arg->{register} && $arg->{type} ne "st") { my $register = $arg->{register}; $register =~ s/^(r[0-9]+)[bwd]$/$1/; - print qq|$prefix\"$register\"|; - $prefix = ", "; + if (!$clobber_added{$register}++) + { + print qq|$prefix\"$register\"|; + $prefix = ", "; + } } } diff --git a/none/tests/x86/gen_insn_test.pl b/none/tests/x86/gen_insn_test.pl index c676ddc731..4e732797df 100644 --- a/none/tests/x86/gen_insn_test.pl +++ b/none/tests/x86/gen_insn_test.pl @@ -859,12 +859,15 @@ while (<>) print qq|$prefix\"m\" \(state[0]\)\n|; $prefix = " : "; + my %clobber_added; - foreach my $arg (@presets, @args) + foreach my $arg (@presets, @results, @args) { - if ($arg->{register} && $arg->{type} ne "st") + my $register = $arg->{register}; + + if ($register && $arg->{type} ne "st" && !$clobber_added{$register}++) { - print qq|$prefix\"$arg->{register}\"|; + print qq|$prefix\"$register\"|; $prefix = ", "; } }