adxintrin.h (_subborrow_u32): New.
authorIlya Tocar <ilya.tocar@intel.com>
Wed, 3 Sep 2014 09:24:34 +0000 (09:24 +0000)
committerIlya Tocar <tocarip@gcc.gnu.org>
Wed, 3 Sep 2014 09:24:34 +0000 (13:24 +0400)
gcc/
2014-09-02  Ilya Tocar  <ilya.tocar@intel.com>

        * config/i386/adxintrin.h (_subborrow_u32): New.
        (_addcarry_u32): Ditto.
        (_subborrow_u64): Ditto.
        (_addcarry_u64): Ditto.
        * config/i386/i386.c (ix86_builtins): Add IX86_BUILTIN_SBB32,
        IX86_BUILTIN_SBB64.
        (ix86_init_mmx_sse_builtins): Handle __builtin_ia32_sbb_u32,
        __builtin_ia32_sbb_u64

testsuite/
2014-09-02  Ilya Tocar  <ilya.tocar@intel.com>

        * gcc.target/i386/adx-addcarryx32-1.c: Test addcarry, subborrow.
        * gcc.target/i386/adx-addcarryx32-2.c: Ditto.
        * gcc.target/i386/adx-addcarryx32-3.c: Ditto.
        * gcc.target/i386/adx-addcarryx64-1.c: Ditto.
        * gcc.target/i386/adx-addcarryx64-2.c: Ditto.
        * gcc.target/i386/adx-addcarryx64-3.c: Ditto.

From-SVN: r214860

gcc/ChangeLog
gcc/config/i386/adxintrin.h
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/adx-addcarryx32-1.c
gcc/testsuite/gcc.target/i386/adx-addcarryx32-2.c
gcc/testsuite/gcc.target/i386/adx-addcarryx32-3.c
gcc/testsuite/gcc.target/i386/adx-addcarryx64-1.c
gcc/testsuite/gcc.target/i386/adx-addcarryx64-2.c
gcc/testsuite/gcc.target/i386/adx-addcarryx64-3.c

index db52c61654623b65f3651a4811109fb1e24b0bb4..d620cb28939bc6a0693d1dc647dccb562a483c2a 100644 (file)
@@ -1,3 +1,14 @@
+2014-09-03  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * config/i386/adxintrin.h (_subborrow_u32): New.
+       (_addcarry_u32): Ditto.
+       (_subborrow_u64): Ditto.
+       (_addcarry_u64): Ditto.
+       * config/i386/i386.c (ix86_builtins): Add IX86_BUILTIN_SBB32,
+       IX86_BUILTIN_SBB64.
+       (ix86_init_mmx_sse_builtins): Handle __builtin_ia32_sbb_u32,
+       __builtin_ia32_sbb_u64
+
 2014-09-03  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32.c (nds32_function_arg): Define and rename some
index 611890044c4262655b12d2563e23c6d8bf716282..8f2c01a121b7c916acd1d1c56c1a3c945253329a 100644 (file)
 #ifndef _ADXINTRIN_H_INCLUDED
 #define _ADXINTRIN_H_INCLUDED
 
+extern __inline unsigned char
+__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);
+}
+
+extern __inline unsigned char
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_addcarry_u32 (unsigned char __CF, unsigned int __X,
+              unsigned int __Y, unsigned int *__P)
+{
+    return __builtin_ia32_addcarryx_u32 (__CF, __X, __Y, __P);
+}
+
 extern __inline unsigned char
 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _addcarryx_u32 (unsigned char __CF, unsigned int __X,
@@ -37,6 +53,22 @@ _addcarryx_u32 (unsigned char __CF, unsigned int __X,
 }
 
 #ifdef __x86_64__
+extern __inline unsigned char
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_subborrow_u64 (unsigned char __CF, unsigned long __X,
+               unsigned long __Y, unsigned long long *__P)
+{
+    return __builtin_ia32_sbb_u64 (__CF, __Y, __X, __P);
+}
+
+extern __inline unsigned char
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_addcarry_u64 (unsigned char __CF, unsigned long __X,
+              unsigned long __Y, unsigned long long *__P)
+{
+    return __builtin_ia32_addcarryx_u64 (__CF, __X, __Y, __P);
+}
+
 extern __inline unsigned char
 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _addcarryx_u64 (unsigned char __CF, unsigned long __X,
index 61b337827258d99caf7735da3e405058daa5df5b..1ca4890c02df0928f53eb3ceb5902fa038ab40f8 100644 (file)
@@ -28789,6 +28789,10 @@ enum ix86_builtins
   IX86_BUILTIN_ADDCARRYX32,
   IX86_BUILTIN_ADDCARRYX64,
 
+  /* SBB instructions.  */
+  IX86_BUILTIN_SBB32,
+  IX86_BUILTIN_SBB64,
+
   /* FSGSBASE instructions.  */
   IX86_BUILTIN_RDFSBASE32,
   IX86_BUILTIN_RDFSBASE64,
@@ -31224,6 +31228,14 @@ ix86_init_mmx_sse_builtins (void)
               UCHAR_FTYPE_UCHAR_ULONGLONG_ULONGLONG_PULONGLONG,
               IX86_BUILTIN_ADDCARRYX64);
 
+  /* SBB */
+  def_builtin (0, "__builtin_ia32_sbb_u32",
+              UCHAR_FTYPE_UCHAR_UINT_UINT_PUNSIGNED, IX86_BUILTIN_SBB32);
+  def_builtin (OPTION_MASK_ISA_64BIT,
+              "__builtin_ia32_sbb_u64",
+              UCHAR_FTYPE_UCHAR_ULONGLONG_ULONGLONG_PULONGLONG,
+              IX86_BUILTIN_SBB64);
+
   /* Read/write FLAGS.  */
   def_builtin (~OPTION_MASK_ISA_64BIT, "__builtin_ia32_readeflags_u32",
                UNSIGNED_FTYPE_VOID, IX86_BUILTIN_READ_FLAGS);
@@ -35628,6 +35640,16 @@ rdseed_step:
       emit_insn (gen_zero_extendqisi2 (target, op2));
       return target;
 
+    case IX86_BUILTIN_SBB32:
+      icode = CODE_FOR_subsi3_carry;
+      mode0 = SImode;
+      goto addcarryx;
+
+    case IX86_BUILTIN_SBB64:
+      icode = CODE_FOR_subdi3_carry;
+      mode0 = DImode;
+      goto addcarryx;
+
     case IX86_BUILTIN_ADDCARRYX32:
       icode = TARGET_ADX ? CODE_FOR_adcxsi3 : CODE_FOR_addsi3_carry;
       mode0 = SImode;
index 63105ca7b8ee3611e98ba7985b5ee577e963128d..4065e49dc9af7c57a5b12f3cab8738fb372a45df 100644 (file)
@@ -1,3 +1,12 @@
+2014-09-03  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * gcc.target/i386/adx-addcarryx32-1.c: Test addcarry, subborrow.
+       * gcc.target/i386/adx-addcarryx32-2.c: Ditto.
+       * gcc.target/i386/adx-addcarryx32-3.c: Ditto.
+       * gcc.target/i386/adx-addcarryx64-1.c: Ditto.
+       * gcc.target/i386/adx-addcarryx64-2.c: Ditto.
+       * gcc.target/i386/adx-addcarryx64-3.c: Ditto.
+
 2014-09-03  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        PR target/61078
index daf5779b1963ea40119c041fa86d314d87fcc507..9fff611b6c09fd6dd7015a43491b11e6705040ab 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-madx -O2" } */
-/* { dg-final { scan-assembler "adcx" } } */
+/* { dg-final { scan-assembler-times "adcx" 2 } } */
+/* { dg-final { scan-assembler-times "sbbl" 1 } } */
 
 #include <x86intrin.h>
 
@@ -12,4 +13,6 @@ void extern
 adx_test (void)
 {
     c = _addcarryx_u32 (c, x, y, sum);
+    c = _addcarry_u32 (c, x, y, sum);
+    c = _subborrow_u32 (c, x, y, sum);
 }
index d38d7ee784fc322ce0e7385b663bda5becb39237..b1da555bc310331fb7a663027e8fa59c28eb3adb 100644 (file)
@@ -22,6 +22,33 @@ adx_test (void)
   c = _addcarryx_u32 (c, x, y, &x);
   /* X = 0xFFFFFFFE, Y = 0xFFFFFFFF, C = 1.  */
 
+  if (x != sum_ref)
+    abort ();
+
+  c = 0;
+  x = y = 0xFFFFFFFF;
+  sum_ref = 0xFFFFFFFE;
+
+  /* X = 0xFFFFFFFF, Y = 0xFFFFFFFF, C = 0.  */
+  c = _addcarry_u32 (c, x, y, &x);
+  /* X = 0xFFFFFFFE, Y = 0xFFFFFFFF, C = 1.  */
+  c = _addcarry_u32 (c, x, y, &x);
+  /* X = 0xFFFFFFFE, Y = 0xFFFFFFFF, C = 1.  */
+
+  if (x != sum_ref)
+    abort ();
+
+  c = 0;
+  x = 1;
+  y = 0;
+  sum_ref = 0x0;
+
+  /* X = 0x00000001, Y = 0x00000000, C = 0.  */
+  c = _subborrow_u32 (c, x, y, &x);
+  /* X = 0xFFFFFFFF, Y = 0x00000000, C = 1.  */
+  c = _subborrow_u32 (c, x, y, &x);
+  /* X = 0xFFFFFFFF, Y = 0xFFFFFFFF, C = 1.  */
+
   if (x != sum_ref)
     abort ();
 }
index 0ed33a9503e1963230e85246de52d603201e8384..d804867a77ea592260c1e8d99d88b6247a5579d6 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-mno-adx -O2" } */
-/* { dg-final { scan-assembler "adcl" } } */
+/* { dg-final { scan-assembler-times "adcl" 2 } } */
+/* { dg-final { scan-assembler-times "sbbl" 1 } } */
 
 #include <x86intrin.h>
 
@@ -12,4 +13,6 @@ void extern
 adx_test (void)
 {
     c = _addcarryx_u32 (c, x, y, sum);
+    c = _addcarry_u32 (c, x, y, sum);
+    c = _subborrow_u32 (c, x, y, sum);
 }
index 45beca851f2ed55c5a2f748995b6df0ad5ca51ac..3608dea79b90d71f838f018ec3f64289fade4e29 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile { target { ! ia32 } } } */
 /* { dg-options "-madx -O2" } */
-/* { dg-final { scan-assembler "adcx" } } */
+/* { dg-final { scan-assembler-times "adcx" 2 } } */
+/* { dg-final { scan-assembler-times "sbbq" 1 } } */
 
 #include <x86intrin.h>
 
@@ -12,4 +13,6 @@ void extern
 adx_test (void)
 {
     c = _addcarryx_u64 (c, x, y, sum);
+    c = _addcarry_u64 (c, x, y, sum);
+    c = _subborrow_u64 (c, x, y, sum);
 }
index 6aa2539c0d1f454caf7bbe3073fdcd59dc0dcee1..b326291bb35c34bf58c8a2b619336626b39a9eb0 100644 (file)
@@ -22,6 +22,33 @@ adx_test (void)
   c = _addcarryx_u64 (c, x, y, &x);
   /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
 
+  if (x != sum_ref)
+    abort ();
+
+  c = 0;
+  x = y = 0xFFFFFFFFFFFFFFFFLL;
+  sum_ref = 0xFFFFFFFFFFFFFFFELL;
+
+  /* X = 0xFFFFFFFFFFFFFFFF, Y = 0xFFFFFFFFFFFFFFFF, C = 0.  */
+  c = _addcarry_u64 (c, x, y, &x);
+  /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
+  c = _addcarry_u64 (c, x, y, &x);
+  /* X = 0xFFFFFFFFFFFFFFFE, Y = 0xFFFFFFFFFFFFFFFF, C = 1.  */
+
+  if (x != sum_ref)
+    abort ();
+
+  c = 0;
+  x = 1LL;
+  y = 0LL;
+  sum_ref = 0x0LL;
+
+  /* X = 0x0000000000000001, Y = 0x0000000000000000, C = 0.  */
+  c = _subborrow_u64 (c, x, y, &x);
+  /* X = 0xFFFFFFFFFFFFFFFF, Y = 0x0000000000000000, C = 1.  */
+  c = _subborrow_u64 (c, x, y, &x);
+  /* X = 0x0000000000000000, Y = 0x0000000000000000, C = 1.  */
+
   if (x != sum_ref)
     abort ();
 }
index 4bbf74bfc2de8c717561d77cdd406c0073907061..9d9809d74fecfa8bda48bee640db4c758ae1f520 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile { target { ! ia32 } } } */
 /* { dg-options "-mno-adx -O2" } */
-/* { dg-final { scan-assembler "adcq" } } */
+/* { dg-final { scan-assembler-times "adcq" 2 } } */
+/* { dg-final { scan-assembler-times "sbbq" 1 } } */
 
 #include <x86intrin.h>
 
@@ -12,4 +13,6 @@ void extern
 adx_test (void)
 {
     c = _addcarryx_u64 (c, x, y, sum);
+    c = _addcarry_u64 (c, x, y, sum);
+    c = _subborrow_u64 (c, x, y, sum);
 }