]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Use two separate assembler argument bindings for loading or storing
authorTom Hughes <tom@compton.nu>
Mon, 28 Mar 2011 13:51:41 +0000 (13:51 +0000)
committerTom Hughes <tom@compton.nu>
Mon, 28 Mar 2011 13:51:41 +0000 (13:51 +0000)
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
none/tests/x86/gen_insn_test.pl

index 91dec10e8acd8d8389a12c687b2308716242e45c..409249e3ea456dbb25f236f6f9e17fc98b914383 100644 (file)
@@ -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 = ", ";
         }
     }
index b6ecb639152af8c024b0377b0fb15df73ed6dd29..1fc3a3a5812ca6a1fd8db9f707a431ea90e65163 100644 (file)
@@ -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 = ", ";
         }
     }