From e177ef4590fda39626254e50fcd7ace373a01cc8 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 28 Mar 2011 13:51:41 +0000 Subject: [PATCH] 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 --- none/tests/amd64/gen_insn_test.pl | 48 +++++++++++++++++++++++++------ none/tests/x86/gen_insn_test.pl | 48 +++++++++++++++++++++++++------ 2 files changed, 80 insertions(+), 16 deletions(-) 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 = ", "; } } -- 2.47.2