re PR target/81294 (_subborrow_u64 argument order inconsistent with intrinsic referen...
authorUros Bizjak <ubizjak@gmail.com>
Tue, 4 Jul 2017 20:46:38 +0000 (22:46 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 4 Jul 2017 20:46:38 +0000 (22:46 +0200)
PR target/81294
* config/i386/adxintrin.h (_subborrow_u32): Swap _X and _Y
arguments in the call to __builtin_ia32_sbb_u32.
(_subborrow_u64): Swap _X and _Y arguments in the call to
__builtin_ia32_sbb_u64.

testsuite/ChangeLog:

PR target/81294
* gcc.target/i386/adx-addcarryx32-2.c (adx_test): Swap
x and y arguments in the call to _subborrow_u32.
* gcc.target/i386/adx-addcarryx64-2.c (adx_test): Swap
x and y arguments in the call to _subborrow_u64.
* gcc.target/i386/pr81294-1.c: New test.
* gcc.target/i386/pr81294-2.c: Ditto.

From-SVN: r249976

gcc/ChangeLog
gcc/config/i386/adxintrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/adx-addcarryx32-2.c
gcc/testsuite/gcc.target/i386/adx-addcarryx64-2.c
gcc/testsuite/gcc.target/i386/pr81294-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr81294-2.c [new file with mode: 0644]

index d57f764b42de35dd3576ee91088ca4933d518416..e09edc970f192b67acc3ae641d7292d38a0e3e71 100644 (file)
@@ -1,3 +1,11 @@
+2017-07-04  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/81294
+       * config/i386/adxintrin.h (_subborrow_u32): Swap _X and _Y
+       arguments in the call to __builtin_ia32_sbb_u32.
+       (_subborrow_u64): Swap _X and _Y arguments in the call to
+       __builtin_ia32_sbb_u64.
+
 2017-07-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/81278
index 9c4152b9f360c0f9be408c84da4950ded8ad5654..7acdaf4ab6f7675401eab1c512175e6493620c6d 100644 (file)
@@ -33,7 +33,7 @@ __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _subborrow_u32 (unsigned char __CF, unsigned int __X,
                unsigned int __Y, unsigned int *__P)
 {
-  return __builtin_ia32_sbb_u32 (__CF, __Y, __X, __P);
+  return __builtin_ia32_sbb_u32 (__CF, __X, __Y, __P);
 }
 
 extern __inline unsigned char
@@ -58,7 +58,7 @@ __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _subborrow_u64 (unsigned char __CF, unsigned long long __X,
                unsigned long long __Y, unsigned long long *__P)
 {
-  return __builtin_ia32_sbb_u64 (__CF, __Y, __X, __P);
+  return __builtin_ia32_sbb_u64 (__CF, __X, __Y, __P);
 }
 
 extern __inline unsigned char
index f1fbe61d131c19e478df153469a59732a909c197..18ec2147b16f71d0c3ec00122295c84bc87c2465 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-04  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/81294
+       * gcc.target/i386/adx-addcarryx32-2.c (adx_test): Swap
+       x and y arguments in the call to _subborrow_u32.
+       * gcc.target/i386/adx-addcarryx64-2.c (adx_test): Swap
+       x and y arguments in the call to _subborrow_u64.
+       * gcc.target/i386/pr81294-1.c: New test.
+       * gcc.target/i386/pr81294-2.c: Ditto.
+
 2017-07-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/aarch64/simd/vminmaxnm_1.c: Fix strict aliasing issues.
index b1da555bc310331fb7a663027e8fa59c28eb3adb..ddee754c9621573ed067ea68d62795e057483787 100644 (file)
@@ -44,9 +44,9 @@ adx_test (void)
   sum_ref = 0x0;
 
   /* X = 0x00000001, Y = 0x00000000, C = 0.  */
-  c = _subborrow_u32 (c, x, y, &x);
+  c = _subborrow_u32 (c, y, x, &x);
   /* X = 0xFFFFFFFF, Y = 0x00000000, C = 1.  */
-  c = _subborrow_u32 (c, x, y, &x);
+  c = _subborrow_u32 (c, y, x, &x);
   /* X = 0xFFFFFFFF, Y = 0xFFFFFFFF, C = 1.  */
 
   if (x != sum_ref)
index b326291bb35c34bf58c8a2b619336626b39a9eb0..287e263a9dd7a369babbff33c86510e248dac080 100644 (file)
@@ -44,9 +44,9 @@ adx_test (void)
   sum_ref = 0x0LL;
 
   /* X = 0x0000000000000001, Y = 0x0000000000000000, C = 0.  */
-  c = _subborrow_u64 (c, x, y, &x);
+  c = _subborrow_u64 (c, y, x, &x);
   /* X = 0xFFFFFFFFFFFFFFFF, Y = 0x0000000000000000, C = 1.  */
-  c = _subborrow_u64 (c, x, y, &x);
+  c = _subborrow_u64 (c, y, x, &x);
   /* X = 0x0000000000000000, Y = 0x0000000000000000, C = 1.  */
 
   if (x != sum_ref)
diff --git a/gcc/testsuite/gcc.target/i386/pr81294-1.c b/gcc/testsuite/gcc.target/i386/pr81294-1.c
new file mode 100644 (file)
index 0000000..6a15ed0
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR target/81294 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <x86intrin.h>
+
+int
+main ()
+{
+  volatile unsigned char c;
+  unsigned int x;
+  volatile unsigned int y, sum_ref;
+
+  c = 0;
+  x = 1;
+  y = 0;
+  sum_ref = 0x0;
+
+  /* X = 0x00000001, Y = 0x00000000, C = 0.  */
+  c = _subborrow_u32 (c, y, x, &x);
+  /* X = 0xFFFFFFFF, Y = 0x00000000, C = 1.  */
+  c = _subborrow_u32 (c, y, x, &x);
+  /* X = 0xFFFFFFFF, Y = 0xFFFFFFFF, C = 1.  */
+
+  if (x != sum_ref)
+    __builtin_abort ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr81294-2.c b/gcc/testsuite/gcc.target/i386/pr81294-2.c
new file mode 100644 (file)
index 0000000..3e3bdb4
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR target/81294 */
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-options "-O2" } */
+
+#include <x86intrin.h>
+
+int main ()
+{
+  volatile unsigned char c;
+  unsigned long long x;
+  volatile unsigned long long y, sum_ref;
+
+  c = 0;
+  x = 1LL;
+  y = 0LL;
+  sum_ref = 0x0LL;
+
+  /* X = 0x0000000000000001, Y = 0x0000000000000000, C = 0.  */
+  c = _subborrow_u64 (c, y, x, &x);
+  /* X = 0xFFFFFFFFFFFFFFFF, Y = 0x0000000000000000, C = 1.  */
+  c = _subborrow_u64 (c, y, x, &x);
+  /* X = 0x0000000000000000, Y = 0x0000000000000000, C = 1.  */
+
+  if (x != sum_ref)
+    __builtin_abort ();
+
+  return 0;
+}