]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/60204 (struct with __m512i is mishandled in function parameter passing...
authorIlya Tocar <ilya.tocar@intel.com>
Thu, 20 Feb 2014 06:32:21 +0000 (06:32 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Thu, 20 Feb 2014 06:32:21 +0000 (06:32 +0000)
gcc/
PR target/60204
* config/i386/i386.c (classify_argument): Pass structures of size
64 bytes or less in register.

tessuite/gcc/
PR target/60204
* gcc.target/x86_64/abi/avx512f/test_passing_structs.c: Update to
reflect abi fix.
* gcc.target/x86_64/abi/avx512f/test_passing_unions.c: Ditto.

From-SVN: r207933

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/x86_64/abi/avx512f/test_passing_structs.c
gcc/testsuite/gcc.target/x86_64/abi/avx512f/test_passing_unions.c

index 6748c0fc36a30b87995f83480352747060636bf3..a401d853ed82df6888fb3e6cd4cd736f3a07d1f2 100644 (file)
@@ -1,3 +1,9 @@
+2014-02-20  Ilya Tocar  <ilya.tocar@intel.com>
+
+       PR target/60204
+       * config/i386/i386.c (classify_argument): Pass structures of size
+       64 bytes or less in register.
+
 2014-02-20  Ilya Tocar  <ilya.tocar@intel.com>
             Kirill Yukhin  <kirill.yukhin@intel.com>
 
index 99d61d21e956a2ed2c7d325306ef0743295da8eb..cd14e520bc23b704083269f0d89256036d26823e 100644 (file)
@@ -6421,8 +6421,8 @@ classify_argument (enum machine_mode mode, const_tree type,
       tree field;
       enum x86_64_reg_class subclasses[MAX_CLASSES];
 
-      /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
-      if (bytes > 32)
+      /* On x86-64 we pass structures larger than 64 bytes on the stack.  */
+      if (bytes > 64)
        return 0;
 
       for (i = 0; i < words; i++)
index 5aad2d5649dfafdf33c2d4d3eddf1cd3d9a8e1df..46ef4dc32cbad9a055496d64df42ae99e73fc0f2 100644 (file)
@@ -1,3 +1,10 @@
+2014-02-20  Ilya Tocar  <ilya.tocar@intel.com>
+
+       PR target/60204
+       * gcc.target/x86_64/abi/avx512f/test_passing_structs.c: Update to
+       reflect abi fix.
+       * gcc.target/x86_64/abi/avx512f/test_passing_unions.c: Ditto.
+
 2014-02-20  Ilya Tocar  <ilya.tocar@intel.com>
            Kirill Yukhin  <kirill.yukhin@intel.com>
 
index a5e147734af262f820acb27350521e030429d2e9..8daa676e7eb2f809571712b96dae1da775b3120b 100644 (file)
@@ -26,16 +26,8 @@ check_struct_passing1 (struct m512_struct ms1 ATTRIBUTE_UNUSED,
                       struct m512_struct ms7 ATTRIBUTE_UNUSED,
                       struct m512_struct ms8 ATTRIBUTE_UNUSED)
 {
-  /* Check the passing on the stack by comparing the address of the
-     stack elements to the expected place on the stack.  */
-  assert ((unsigned long)&ms1.x == rsp+8);
-  assert ((unsigned long)&ms2.x == rsp+72);
-  assert ((unsigned long)&ms3.x == rsp+136);
-  assert ((unsigned long)&ms4.x == rsp+200);
-  assert ((unsigned long)&ms5.x == rsp+264);
-  assert ((unsigned long)&ms6.x == rsp+328);
-  assert ((unsigned long)&ms7.x == rsp+392);
-  assert ((unsigned long)&ms8.x == rsp+456);
+  /* Check register contents.  */
+  check_m512_arguments;
 }
 
 void
index 97122900c479a0d61cbffc2409d07018f7345055..370d15b6273b101ac60fef23244e97fd56f77d7b 100644 (file)
@@ -52,24 +52,8 @@ check_union_passing1(union un1 u1 ATTRIBUTE_UNUSED,
                     union un1 u7 ATTRIBUTE_UNUSED,
                     union un1 u8 ATTRIBUTE_UNUSED)
 {
-   /* Check the passing on the stack by comparing the address of the
-      stack elements to the expected place on the stack.  */
-  assert ((unsigned long)&u1.x == rsp+8);
-  assert ((unsigned long)&u1.f == rsp+8);
-  assert ((unsigned long)&u2.x == rsp+72);
-  assert ((unsigned long)&u2.f == rsp+72);
-  assert ((unsigned long)&u3.x == rsp+136);
-  assert ((unsigned long)&u3.f == rsp+136);
-  assert ((unsigned long)&u4.x == rsp+200);
-  assert ((unsigned long)&u4.f == rsp+200);
-  assert ((unsigned long)&u5.x == rsp+264);
-  assert ((unsigned long)&u5.f == rsp+264);
-  assert ((unsigned long)&u6.x == rsp+328);
-  assert ((unsigned long)&u6.f == rsp+328);
-  assert ((unsigned long)&u7.x == rsp+392);
-  assert ((unsigned long)&u7.f == rsp+392);
-  assert ((unsigned long)&u8.x == rsp+456);
-  assert ((unsigned long)&u8.f == rsp+456);
+  /* Check register contents.  */
+  check_m512_arguments;
 }
 
 void
@@ -82,24 +66,8 @@ check_union_passing2(union un2 u1 ATTRIBUTE_UNUSED,
                     union un2 u7 ATTRIBUTE_UNUSED,
                     union un2 u8 ATTRIBUTE_UNUSED)
 {
-   /* Check the passing on the stack by comparing the address of the
-      stack elements to the expected place on the stack.  */
-  assert ((unsigned long)&u1.x == rsp+8);
-  assert ((unsigned long)&u1.d == rsp+8);
-  assert ((unsigned long)&u2.x == rsp+72);
-  assert ((unsigned long)&u2.d == rsp+72);
-  assert ((unsigned long)&u3.x == rsp+136);
-  assert ((unsigned long)&u3.d == rsp+136);
-  assert ((unsigned long)&u4.x == rsp+200);
-  assert ((unsigned long)&u4.d == rsp+200);
-  assert ((unsigned long)&u5.x == rsp+264);
-  assert ((unsigned long)&u5.d == rsp+264);
-  assert ((unsigned long)&u6.x == rsp+328);
-  assert ((unsigned long)&u6.d == rsp+328);
-  assert ((unsigned long)&u7.x == rsp+392);
-  assert ((unsigned long)&u7.d == rsp+392);
-  assert ((unsigned long)&u8.x == rsp+456);
-  assert ((unsigned long)&u8.d == rsp+456);
+  /* Check register contents.  */
+  check_m512_arguments;
 }
 
 void
@@ -112,24 +80,8 @@ check_union_passing3(union un3 u1 ATTRIBUTE_UNUSED,
                     union un3 u7 ATTRIBUTE_UNUSED,
                     union un3 u8 ATTRIBUTE_UNUSED)
 {
-   /* Check the passing on the stack by comparing the address of the
-      stack elements to the expected place on the stack.  */
-  assert ((unsigned long)&u1.x == rsp+8);
-  assert ((unsigned long)&u1.v == rsp+8);
-  assert ((unsigned long)&u2.x == rsp+72);
-  assert ((unsigned long)&u2.v == rsp+72);
-  assert ((unsigned long)&u3.x == rsp+136);
-  assert ((unsigned long)&u3.v == rsp+136);
-  assert ((unsigned long)&u4.x == rsp+200);
-  assert ((unsigned long)&u4.v == rsp+200);
-  assert ((unsigned long)&u5.x == rsp+264);
-  assert ((unsigned long)&u5.v == rsp+264);
-  assert ((unsigned long)&u6.x == rsp+328);
-  assert ((unsigned long)&u6.v == rsp+328);
-  assert ((unsigned long)&u7.x == rsp+392);
-  assert ((unsigned long)&u7.v == rsp+392);
-  assert ((unsigned long)&u8.x == rsp+456);
-  assert ((unsigned long)&u8.v == rsp+456);
+  /* Check register contents.  */
+  check_m512_arguments;
 }
 
 void
@@ -160,22 +112,8 @@ check_union_passing6(union un6 u1 ATTRIBUTE_UNUSED,
                     union un6 u7 ATTRIBUTE_UNUSED,
                     union un6 u8 ATTRIBUTE_UNUSED)
 {
-  assert ((unsigned long)&u1.x == rsp+8);
-  assert ((unsigned long)&u1.v == rsp+8);
-  assert ((unsigned long)&u2.x == rsp+72);
-  assert ((unsigned long)&u2.v == rsp+72);
-  assert ((unsigned long)&u3.x == rsp+136);
-  assert ((unsigned long)&u3.v == rsp+136);
-  assert ((unsigned long)&u4.x == rsp+200);
-  assert ((unsigned long)&u4.v == rsp+200);
-  assert ((unsigned long)&u5.x == rsp+264);
-  assert ((unsigned long)&u5.v == rsp+264);
-  assert ((unsigned long)&u6.x == rsp+328);
-  assert ((unsigned long)&u6.v == rsp+328);
-  assert ((unsigned long)&u7.x == rsp+392);
-  assert ((unsigned long)&u7.v == rsp+392);
-  assert ((unsigned long)&u8.x == rsp+456);
-  assert ((unsigned long)&u8.v == rsp+456);
+  /* Check register contents.  */
+  check_m512_arguments;
 }
 
 #define check_union_passing1 WRAP_CALL(check_union_passing1)