From: Tom Hughes Date: Mon, 28 Mar 2011 13:51:41 +0000 (+0000) Subject: Use two separate assembler argument bindings for loading or storing X-Git-Tag: svn/VALGRIND_3_7_0~562 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e177ef4590fda39626254e50fcd7ace373a01cc8;p=thirdparty%2Fvalgrind.git Use two separate assembler argument bindings for loading or storing a value in an xmm register as trying to do it with offsets from a single argument apparently causes problems in newer gcc versions. Fix to bug #266931. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11672 --- diff --git a/none/tests/amd64/gen_insn_test.pl b/none/tests/amd64/gen_insn_test.pl index 91dec10e8a..409249e3ea 100644 --- a/none/tests/amd64/gen_insn_test.pl +++ b/none/tests/amd64/gen_insn_test.pl @@ -628,14 +628,30 @@ while (<>) foreach my $result (@results) { - $result->{argnum} = $argnum++; + if ($result->{type} eq "xmm") + { + $result->{argnuml} = $argnum++; + $result->{argnumh} = $argnum++; + } + else + { + $result->{argnum} = $argnum++; + } } foreach my $arg (@presets, @args) { if (defined($arg->{name})) { - $arg->{argnum} = $argnum++; + if ($arg->{type} eq "xmm") + { + $arg->{argnuml} = $argnum++; + $arg->{argnumh} = $argnum++; + } + else + { + $arg->{argnum} = $argnum++; + } } } @@ -678,8 +694,8 @@ while (<>) } elsif ($arg->{type} eq "xmm") { - print qq| \"movlps 0+%$arg->{argnum}, %%$arg->{register}\\n\"\n|; - print qq| \"movhps 8+%$arg->{argnum}, %%$arg->{register}\\n\"\n|; + print qq| \"movlps %$arg->{argnuml}, %%$arg->{register}\\n\"\n|; + print qq| \"movhps %$arg->{argnumh}, %%$arg->{register}\\n\"\n|; } elsif ($arg->{type} eq "st") { @@ -792,8 +808,8 @@ while (<>) } elsif ($result->{type} eq "xmm") { - print qq| \"movlps %%$result->{register}, 0+%$result->{argnum}\\n\"\n|; - print qq| \"movhps %%$result->{register}, 8+%$result->{argnum}\\n\"\n|; + print qq| \"movlps %%$result->{register}, %$result->{argnuml}\\n\"\n|; + print qq| \"movhps %%$result->{register}, %$result->{argnumh}\\n\"\n|; } elsif ($result->{type} eq "st") { @@ -841,7 +857,15 @@ while (<>) foreach my $result (@results) { - print qq|$prefix\"=m\" \($result->{name}\)|; + if ($result->{type} eq "xmm") + { + print qq|$prefix\"=m\" \($result->{name}.uq[0]\), \"=m\" \($result->{name}.uq[1]\)|; + } + else + { + print qq|$prefix\"=m\" \($result->{name}\)|; + } + $prefix = ", "; } @@ -853,7 +877,15 @@ while (<>) { if (defined($arg->{name})) { - print qq|$prefix\"m\" \($arg->{name}\)|; + if ($arg->{type} eq "xmm") + { + print qq|$prefix\"m\" \($arg->{name}.uq[0]\), \"m\" \($arg->{name}.uq[1]\)|; + } + else + { + print qq|$prefix\"m\" \($arg->{name}\)|; + } + $prefix = ", "; } } diff --git a/none/tests/x86/gen_insn_test.pl b/none/tests/x86/gen_insn_test.pl index b6ecb63915..1fc3a3a581 100644 --- a/none/tests/x86/gen_insn_test.pl +++ b/none/tests/x86/gen_insn_test.pl @@ -605,14 +605,30 @@ while (<>) foreach my $result (@results) { - $result->{argnum} = $argnum++; + if ($result->{type} eq "xmm") + { + $result->{argnuml} = $argnum++; + $result->{argnumh} = $argnum++; + } + else + { + $result->{argnum} = $argnum++; + } } foreach my $arg (@presets, @args) { if (defined($arg->{name})) { - $arg->{argnum} = $argnum++; + if ($arg->{type} eq "xmm") + { + $arg->{argnuml} = $argnum++; + $arg->{argnumh} = $argnum++; + } + else + { + $arg->{argnum} = $argnum++; + } } } @@ -647,8 +663,8 @@ while (<>) } elsif ($arg->{type} eq "xmm") { - print qq| \"movlps 0%$arg->{argnum}, %%$arg->{register}\\n\"\n|; - print qq| \"movhps 8%$arg->{argnum}, %%$arg->{register}\\n\"\n|; + print qq| \"movlps %$arg->{argnuml}, %%$arg->{register}\\n\"\n|; + print qq| \"movhps %$arg->{argnumh}, %%$arg->{register}\\n\"\n|; } elsif ($arg->{type} eq "st") { @@ -756,8 +772,8 @@ while (<>) } elsif ($result->{type} eq "xmm") { - print qq| \"movlps %%$result->{register}, 0%$result->{argnum}\\n\"\n|; - print qq| \"movhps %%$result->{register}, 8%$result->{argnum}\\n\"\n|; + print qq| \"movlps %%$result->{register}, %$result->{argnuml}\\n\"\n|; + print qq| \"movhps %%$result->{register}, %$result->{argnumh}\\n\"\n|; } elsif ($result->{type} eq "st") { @@ -806,7 +822,15 @@ while (<>) foreach my $result (@results) { - print qq|$prefix\"=m\" \($result->{name}\)|; + if ($result->{type} eq "xmm") + { + print qq|$prefix\"=m\" \($result->{name}.uq[0]\), \"=m\" \($result->{name}.uq[1]\)|; + } + else + { + print qq|$prefix\"=m\" \($result->{name}\)|; + } + $prefix = ", "; } @@ -818,7 +842,15 @@ while (<>) { if (defined($arg->{name})) { - print qq|$prefix\"m\" \($arg->{name}\)|; + if ($arg->{type} eq "xmm") + { + print qq|$prefix\"m\" \($arg->{name}.uq[0]\), \"m\" \($arg->{name}.uq[1]\)|; + } + else + { + print qq|$prefix\"m\" \($arg->{name}\)|; + } + $prefix = ", "; } }