|
From: <sv...@va...> - 2011-03-28 13:51:49
|
Author: tom
Date: 2011-03-28 14:51:41 +0100 (Mon, 28 Mar 2011)
New Revision: 11672
Log:
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.
Modified:
trunk/none/tests/amd64/gen_insn_test.pl
trunk/none/tests/x86/gen_insn_test.pl
Modified: trunk/none/tests/amd64/gen_insn_test.pl
===================================================================
--- trunk/none/tests/amd64/gen_insn_test.pl 2011-03-28 13:08:52 UTC (rev 11671)
+++ trunk/none/tests/amd64/gen_insn_test.pl 2011-03-28 13:51:41 UTC (rev 11672)
@@ -628,14 +628,30 @@
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 @@
}
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 @@
}
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 @@
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 @@
{
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 = ", ";
}
}
Modified: trunk/none/tests/x86/gen_insn_test.pl
===================================================================
--- trunk/none/tests/x86/gen_insn_test.pl 2011-03-28 13:08:52 UTC (rev 11671)
+++ trunk/none/tests/x86/gen_insn_test.pl 2011-03-28 13:51:41 UTC (rev 11672)
@@ -605,14 +605,30 @@
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 @@
}
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 @@
}
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 @@
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 @@
{
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 = ", ";
}
}
|